明明只是活着,哀伤却无处不在⋯⋯ 收藏本站
登陆 / 注册 搜索

阅读:7.1K   回复: 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 非常感谢!

查看全部评分

帖子热度 7114 ℃

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

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

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

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

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

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

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

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

你们有见过这么整齐的十五个字吗
这么整齐的十五个字人家最喜欢了

👮‍♂️‍🦺🎺😒🙌


他们都说打出十五字才是最标准的
我也没办法因为我要打十五个字啊
我说了多少次了不要只打十五个字
你们那些十五字神马的完全弱爆了
都怪吧主删我贴所以我只能到处逛👨🦱‍💍🔒😊🤳
为了经验我没办法只能遇贴就灌水
灌水也要讲技术保证句句是十五字
如今发帖有困难整不好就被删贴了
我也没办法吧主他老是删我帖子啊
只能够这样用十五字来混混经验了
👌🌦🥣✔🐴‎用十五字混经验的有谁比我厉害呢
有前排就要占没前排也要灌一下水
有前排不占或者不灌水是会后悔的
无论是多么无聊的帖子我都会去的
因为为了一句话万一这贴子火了呢
👍⛵🍭®🦋‌句句十五个字有哪个高手能超越呢
#367:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表