编程到底难在哪里?

虽然我不是大牛,但从初中开始接触编程时间也挺长了,也积累了一些关于编程的想法。

不同的人对编程难的理解是不同的,因为编程本身的维度是不一样的,但最根本的,难在复杂性的控制,而不是一个个独立的概念.。

一、初级编程困难

普通的像office上写个vba,此时需要的只是永远不会变的业务逻辑,并且这种代码一般都是一个人写的1000行以内。

因此你不需要软件工程的知识,时间长了甚至也许会有编程很简单的错觉。

这种编程的难是在于逻辑。

逻辑的难再上升一点便是算法,数据结构,这时候你会学到时空复杂度,学会用三种方法证明快排的时间复杂度,知道了现代计算机在面对非P类问题的无力,知道图灵机对于undecidable的问题的局限性,知道了用泵引理证明标准正则表达式永远也找不到匹配的括号。

这时候你觉得很难,难在发现计算机其实干不了很多事。

二、中级编程困难

接下来你或许回去刷各路oj,面对题目,第一步难在问题的抽象和建模上,第二步难在抽象出中正确模型后算法的选择上.也许一个非常像贪心的题结果是网络流,也许一个非常像DP的题,结果是最短路,矩阵快速幂......

抽像出模型后,根据实际问题的各种条件选出最优方案,例如这种形式的dp可以单调栈,斜率,平行四边形优化,选择在线or离线算法?稀疏图还是稠密图?

这时候你会觉得很难,难在最基础的算法。 

三、高级编程困难

接下来你会细分到具体的领域,此时的难就难在领域知识。

这也是见仁见智.图形学各种立体角的积分也许对你很难,数学系转过来的小张也许就觉得公式比代码来得亲切。

当然你也可以不管的,将系统看成一个黑盒,无脑调用现成的api,你不必关注神经网络是如何backpropagation的。

tensorflow,caffe等成熟的库已经把所有东西封装的很好了,你不必关注C++ RTTI的特性是如何实现的。

现实生活中存在着大量这样的"程序员",当发生问题时,梯度消失?爆炸?

即使没有太难的专业知识只是业务逻辑,也会疑惑为啥我把循环展开速度会快那么多(gcc O2默认不进行循环展开优化)?

为啥我只是把数组长度变一下速度立马变了?

他们也可以试出很多经验规律,可以工作的很出色,但他们会觉得很难。

这样的难,难在编程所在平台,领域专业本身的复杂度,如同上面循环展开等。

这是由于目前CPU采用的分支预测策略以及pipeline被打断,因此也算作领域的知识。

四、架构,不如说是整理代码

最后,你终于开始写real world的代码了,你会发现代码有10个G!

用vs2017加载所有代码便是一个晚上,你这辈子都无法全部读完所有代码,此时你发现,控制代码复杂度非常难。

当新增一个需求,坏味的代码要在密密麻麻的代码和文件中修改一两个参数,代码之间耦合非常大,A功能调好B功能不能用,AB都调好C又不能用,等C再调好,少年,晚上3点了,不要再加班了。

一群人同时编译一个函数,一个类,一个文件,你刚准备提交,别人又在这个文件里做了改动conflict了,你又只能花半小时把代码合回去,又要看别人的合代码防止冲突,合完刚想提交又有一个人提交,又conflict了。

如果之前的东西偏计科,那这里便是偏软工的难度了。

你会学着让代码分层,使用单例让其只有一个访问入口点,减少全局变量.体会到了don't repeat urself的用处。

看到一长段if else的逻辑,会想到用策略模式让其变成一个个分散的类了,不再用全局变量了,识别清楚了哪些地方可能会有改动,日后业务可能会有扩展,提前调整架构。

例如日后项目要增加支持中英双语了,别人还在忙着将string改成wstring,仿佛重新写一个系统,而你由于代码架构灵活只要将新加的语言翻译好即可.

这才明白所谓架构,不如接地气的说下是整理代码。

就好像面对一个巨大的房子,里面各种凌乱的衣服,电器,家具,你要做的是把袜子分们别类的放到一堆,并且整个房子只有这个柜子能找到袜子,用完也只能放到这个柜子里。

这样就不至于东一只袜子,西一只袜子。

遥控器的按钮不能串,不能想打开电视机,空调也打开了;当一个柜子塞满了衣服,并且有很多不同的人来取这些衣服,不如分出一些小柜子,按取的人分门别类,如果有若干人自己的衣服太多,则分出来春装夏装秋装继续分小柜子。

房子的某些位置识别出可能日后会搬进新家电,那一开始走线的时候就要在那儿装接线板,插座。

架构这个词太高高在上了,整理才适合。

接着你会发现OO的思想本来就有着非比寻常的复杂度,每一个instance都是带状态的,这一次调这个接口的状态和下一次可能是不一样的,它是不纯的。

当遇到并发的情况时,这个缺点尤为明显。

你也许会接触FP那套纯函数的想法来消除副作用,然后打开了一扇崭新的大门。

编程难在哪里,不同的人,时期都会有不同维度的回答。

但在我看来,编程的难在于世界本来就是复杂的,而编程只是用逻辑去模拟整个世界,编程的难在于逻辑的难,世界的难。

这时候你刚接触TMP的学弟对着动辙上百个编译错误的甚至把编译器搞挂的代码,说编程好难啊。

是啊,编程好难啊。

我目前是在职Java开发,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线等方面的问题,都可以申请加入我的Java学习交流群:1080621881,里面聚集了很多正在自学Java的初学者,文件里面还有我做Java技术这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书记教程,需要的话都可以自行来浏览获取。

你可能感兴趣的:(程序员,编程,java,编程思想,程序员发展)