编程难在哪里

转载知乎:www.zhihu.com/question/528871933
(如有侵权请联系本人删除)
编程有点类似数学。

我们知道,数学只有+、-、x、÷、=、>、<、∫、∮、Σ、lim、Δ、√、㏒、∈、∩、∪等很少一些符号,数字也只需要认识0123456789等几个就足够了。

嗯,你现在把这些符号抄小本子上,有空就写有空就背,学得会数学吗?

再附加上每个符号的读音、意义?

那你背吧。再过几天6年级月考就要开始了,我看你交不交白卷。

编程也一样。

很多人走进了“死记硬背编程语言关键字/语法规范”的误区,把“编程语言”学的滚瓜烂熟,一出手把积分符号画的优美流畅——相比之下,数学教授都画成狗刨了。

但他就是不会解二元一次方程组。

问题在哪?

问题在于,数学符号是拿来表达思想的。

你有思想,没见过这些符号你也能表达,自创符号就行了——之所以要学习那些通用符号,只是为了方便你和他人交流而已。

编程也一样。

代码是表达思想的,你知道一件事应该怎么做,你自然就能写出程序来——事实上,为了简便,我们程序员讨论思路是绝不会直接写代码的,太麻烦了:有个东西叫伪代码,还有个东西叫用例图……哦,是的,还有数据流图、控制流图等等等等。

所谓编程,实际上就是“我们有一个目标,为了达到目标,我们需要如此这般的处理”——其中的“如此这般”必须极尽精确、精确到“数字比较大小”然后“如果、那么”的程度。

没错。比如我们要控制机器人,要让它抬手30°,那就必须清清楚楚写出30——嗯,实际上,经常的,机器人手臂转动1°,驱动电机要转7.5圈;所以……实际程序就是:我们向电机控制器发一个高电平,驱动它转动,然后霍尔元件会告诉我们电机已经转了多少圈(比如每转一圈给我们发两个脉冲),那么当我们收到2X7.5X30个脉冲时,机器人手臂就转到位了。

没错。一切最终都是个数字,这就是程序员眼中的世界。

写程序,就是通过数字,精确的把事情做对。

这需要三步。

第一步,你需要知道普通人看起来很“高级”的一件事,背后是什么数学原理。

比如,我们要帮助小姑娘“美白”照片,这是怎么一回事?

很简单。人的皮肤有毛孔、有黑头、有色斑;这些东西体现在“照片”上,是“位图”中的某些点存在“颜色跳变”;那么我们识别出人的五官后、按照比例求出黑头/色斑的典型大小,然后识别出所有大小相仿的“颜色跳变”区,把它的色彩调整到周围皮肤同色——于是,清晰度不变、但皮肤完美无瑕的照片就出现了。

思考题:其实也可以求一小块皮肤的平均色,然后把所有色彩调整到这个平均色。请论述这个做法会给照片带来什么影响。

第二步,知道了数学原理后,把它翻译成更精确的表示。

比如,“颜色跳变”究竟是什么?如何用程序判断?

这一步之后,伪代码就产生了。

第三步,转换伪代码到某种编程语言;最好结合这种语言本身的语法或者质量较好的库,从而简化程序、减少错误,也降低开发工作量。

正因此,我有这么个回答:怎样判断一个人是否适合学习编程?

所以说编程难在哪?

难在:

1、绝大多数人从一开始就学偏了。他们使劲儿背数学符号,却绝不看数学书。

2、它要求你彻彻底底把一个完整的器物、一项社会活动(包括工厂生产、学校排课等)搞懂、搞透;你越通透,就越能写好程序;否则……慢慢写bug吧。

3、它要求你学会负责,学会独立的主导完成一件事、解决一个问题。

注意,“解决一个问题”并不是“别人给你一道题,你写出答案”,而是“老板说我们要造个智能电饭煲,你要给出智能电饭煲的定义、指出在哪些点可以‘智能’、哪些点不得不让人工干预”。

然后,所有你认为可以智能的点,你都要自己提问——包括但不限于‘如何智能’‘会不会假阳性’‘会不会假阴性’‘判断错误最差结果会是什么’‘如何及时发现错误’‘如何纠错’‘如何降低成本’等等问题,你都要结合你的方案、以更合适更接地气的方式提出。

比如,当我们想用磁铁的居里点来判断温度时,就要问一下:如果做锅巴饭,这东西还能不能用?但为了兼容锅巴饭,用户烧水时会不会产生额外的风险?如何证明会还是不会呢?

现实中,第一点就足够刷掉90%以上的人。这就是编程困难的原因。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1
__yu
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!