尽管我不是大牛,但从初中开始接触编程工夫也挺长了,也积攒了一些对于编程的想法。
不同的人对编程难的了解是不同的,因为编程自身的维度是不一样的,但最基本的,难在复杂性的管制,而不是一个个独立的概念.。
一、高级编程艰难
一般的像 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 文档书记教程,需要的话都能够自行来浏览获取。