我裤子脱了你就给我看这个!!! 每日签到 收藏本站
登陆 / 注册 搜索

USERCENTER


查看:3928   回复: 4

[# 其他] 编程的本质——致初学者

[复制链接]
发新帖
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2017-8-26 00:03:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

        俗话说,开卷有益, 前几天又翻了下《计算机程序的构造和解释》,看到一个采用牛顿法求平方根的例子,产生了点新的感想,和大家分享下。

        平方根的数学定义是这样的,对于一个数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 非常感谢!

查看全部评分

Sunglassescat「出类拔萃」 发表于 2017-8-27 08:17:11 | 只看该作者
陷入沉思#j346:
清风霁月「出类拔萃」 发表于 2017-10-10 16:48:37 来自手机 | 只看该作者
我了个去,顶了#j355:
著墨染雨君画夕「出类拔萃」 发表于 2018-1-21 16:47:39 | 只看该作者
向楼主学习
梦纸「出类拔萃」 发表于 2018-1-21 20:25:55 来自手机 | 只看该作者
你们有见过这么整齐的十五个字吗
这么整齐的十五个字人家最喜欢了
他们都说打出十五字才是最标准的
我也没办法因为我要打十五个字啊
我说了多少次了不要只打十五个字
你们那些十五字神马的完全弱爆了
都怪吧主删我贴所以我只能到处逛
为了经验我没办法只能遇贴就灌水
灌水也要讲技术保证句句是十五字
如今发帖有困难整不好就被删贴了
我也没办法吧主他老是删我帖子啊
只能够这样用十五字来混混经验了
用十五字混经验的有谁比我厉害呢
有前排就要占没前排也要灌一下水
有前排不占或者不灌水是会后悔的
无论是多么无聊的帖子我都会去的
因为为了一句话万一这贴子火了呢
句句十五个字有哪个高手能超越呢
#367:
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于我们|小黑屋|手机版|Archiver|古黑论

GMT+8, 2019-8-26 12:50 , Processed in 0.044515 second(s), 31 queries , Gzip On, Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表