忘记本身就是一件不可能的事。 收藏本站
登陆 / 注册 搜索

阅读:7.5K   回复: 4

编程的本质——致初学者

[复制链接]
仗剑天涯论坛大牛 2017-8-26 00:03 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百 赞助会员 金点子奖
    大部分程序猿现在都忙着业务,忽视基础,还会为自己找借口说 “工作又不需要”!我只能说,程序猿群体也会有一个金字塔的等级分工,各个层次的人都得需要,就看你怎么定位你在金字塔中的位置了 。

    金字塔上层的程序猿肯定得具备足够扎实的计算机基础。

    俗话说,开卷有益, 前几天又翻了下《计算机程序的构造和解释》,看到一个采用牛顿法求平方根的例子,产生了点新的感想,和大家分享下。
💪🌡🧊🆒‏
    平方根的数学定义是这样的,对于一个数x , 如果有另外一个数r,  r大于等于0 ,并且r 的平方等于x , 那 r 就是 x的平方根。

    这个定义描述了平方根的一般性事实,但是这是一个声明性的描述,并没有告诉我们一个具体的计算过程。 假设我们要写一个程序,给定一个数x , 怎么求得它的平方根呢?

👨‍🚒‌👠🖲☠👆


    初学者可能会觉得, 我可以写个这样的程序啊:
    
    square_root( x ){

🧑‍💻‍🎒🖥😆👆
        找到一个r ,确保 r的平方等于 x


        返回r
    }
🤝⛄🍚🐝‏
    但是这个函数一点用都没有,只不过把原来的问题给重新描述了一遍而已。

    如果有一个这样的编程语言,程序员会非常高兴: 我们可以用声明性的方式来写程序了!只需要告诉计算机说,找到一个r ,使得r的平方等于输入x 即可。
👳‏🎩📡😒🤟
    但是在当前的计算机体系下面, 这是绝对不可能的,计算机是个笨家伙,它只能按照人类的告诉他的指令一步步的工作, 它突出的优势只是运行得比较快而已。

    程序员必须要告诉计算机到底该怎么做,怎么去找到那个r, 第一步怎么做,第二步怎么做。。。。。什么时候结束。#j318:

    针对于求平方根的例子, 程序员需要找到一个算法,然后把这个算法的步骤和计算过程用计算机语言描述出来,形成计算机指令。

🎠🍼⚛🐥‌


    这个计算过程大概长这个样子:

    先猜测r = 1 , 判断r 的平方和x 是不是非常接近(例如相差0.0001)
🧒‏👗🏮😪🤞
    如果不接近,让 r = (r+x/r) / 2, 继续判断r的平方 与 x 是不是非常接近

    如果不接近, 继续让 r = (r+x/r)/2 。。。。。

    对于 x =2 , 其计算过程如下:

🧓‍🕶🧬😷👃



编程的本质——致初学者 1-求平方根.png

    很明显,这是一个逐渐逼近的过程,计算的次数越多,越逼近真正的平方根。

    改写为编程语言描述:
👂🦼🌰❌🐉‏
编程的本质——致初学者 2-编程的描述.png

    请暂停阅读10秒钟, 仔细体会上述的计算过程,它和之前声明性描述有什么区别。

    一个描述平方根是什么, 另外一个描述求平方根计算机具体怎么做。
🙌🛩🍽♊🐅‌
    无论多么复杂的程序,无论的前端之王javascript , 还是后端的java ,无论是面向过程的还是面向对象的,最终的做的同样的事情:把用户描述的需求(通常是声明式的)变成计算机可以理解,可以运算的步骤。


    “是什么” 和 “怎么做”之间有着巨大的鸿沟,这个鸿沟就需要程序员的大脑去填补。 求平方根是个非常单纯的例子,已经有数学家们想好了具体的计算办法, 程序员翻译一下,变成计算机语言就行。
🖐🍟↔🦦‌
    现实中这样的好事儿是不多的, 比如说你们公司要搞个社交化的促销: 用户连续x天转发某个活动到朋友圈就可以获得奖品, 转发的有效时间是早上9点至晚上10点, 同一天转发多次只算一次。

    在实现上你首先得记录用户什么时间转发的,然后对转发时间排个序,过滤掉那些无效的转发,计算这些用户的转发时间没有连续性, 连续的天数到了指定的数值没有。 —— 这就不存在现成的算法,程序员需要自己想出计算的步骤,然后用代码实现。

👈🍒🆗🐴‍    可以看出,这不需要高深的数学知识,就是找到一个合适的算法和数据结构来描述它,这是编程最最基本的能力。

    对于小白来说, 通过自学和培训,可能很快学会一个语言的使用, 可是基本能力不加强,早晚要吃亏的。最突出的表现是给他一个很简单的业务,他花了很长时间才写出一个漏洞百出的版本。

    随着业务越来越复杂,一个领域的问题会和其他领域的问题交织纠缠在一起,让复杂度大大增加,简单的一个或几个算法和数据结构是搞不定的,  这时候必须得用一些辅助的手段才能解决,比如使用封装、分层、模式、分布式等等, 这是属于另外一个维度的设计能力了, 这种能力和编程语言都没有关系。👳‎🎒✒🤑👃

    初学者完全可以先学会编程语言和框架,先具备工作能力,然后必须加强数据结构和算法的训练,随着经验的积累,慢慢地扩展到设计和架构层面。

上一篇
下一篇

评分

参与人数 2成长值 +2 金币 +2 展开 理由
清风徐来 + 1 + 1 欢迎分析讨论交流,古黑论有你更精彩!.
Sunglassescat + 1 + 1 非常感谢!

查看全部评分

帖子热度 7576 ℃

Sunglassescat 「龙战于野」 2017-8-27 08:17 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

陷入沉思#j346:
清风霁月 「出类拔萃」 2017-10-10 16:48 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

我了个去,顶了#j355:
著墨染雨君画夕 「出类拔萃」 2018-1-21 16:47 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

向楼主学习
梦纸 「出类拔萃」 2018-1-21 20:25 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

你们有见过这么整齐的十五个字吗
这么整齐的十五个字人家最喜欢了👨‍🚒‏🧦🧻😇💅
他们都说打出十五字才是最标准的
我也没办法因为我要打十五个字啊
我说了多少次了不要只打十五个字
你们那些十五字神马的完全弱爆了
都怪吧主删我贴所以我只能到处逛

👮‍♂️‌🧥💾🤩👂


为了经验我没办法只能遇贴就灌水
灌水也要讲技术保证句句是十五字
如今发帖有困难整不好就被删贴了
我也没办法吧主他老是删我帖子啊
只能够这样用十五字来混混经验了👦‍👜💾💩💅
用十五字混经验的有谁比我厉害呢
有前排就要占没前排也要灌一下水
有前排不占或者不灌水是会后悔的
无论是多么无聊的帖子我都会去的
因为为了一句话万一这贴子火了呢
👍🏠🔪🅾🐟‏句句十五个字有哪个高手能超越呢
#367:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表