大道至简读后感
《大道至简》让我明白为什么学了C++再来学Java,我还在原地踏步
去年学C,今年学C++,现在正在学Java。按理说学了三门语言,写代码应该越来越顺手才对。但事实是,每次换一门语言,我只是把语法重新背一遍,写出来的东西该乱还是乱,该绕还是绕。我一度怀疑自己是不是没有编程的天赋。
直到读了《大道至简》,我才意识到问题出在哪儿——我一直在学"怎么写代码",从来没学过"怎么解决问题"。
我过去是怎么做的
学C的时候,老师讲变量、循环、数组,我就背这些。写作业的时候,反正拿到题目就开始敲。记得有一次写一个通讯录管理系统,要求能添加、删除、查找、显示。我打开Dev-C++就干,把所有功能全塞进main函数,变量名从a定义到z还不够用。最后写了一堆乱糟糟的代码,报错的时候自己都找不到括号配没配齐。
学C++的时候,听说有"面向对象"这个概念,觉得好高级。老师说类、对象、封装、继承,我听得云里雾里,但作业里要求写类,我就照着格式硬写。写是写了,但我根本不知道为什么要这样。一个简单的学生信息管理,我写了一个Student类,里面塞了十几个成员函数,其实大部分根本用不到。我只是在"表演面向对象",不是真的在用它。
现在学Java,又听说"面向对象更彻底",所有东西都要放在类里。我继续老套路,把以前用C写的代码翻译成Java语法,加了class关键字,加上public static void main,然后告诉自己"嗯,这就是Java了"。每次作业都能交上去,分数也不算低。但一个特别明显的感受是——写C的时候我头疼,写C++的时候我头疼,写Java的时候我还是头疼。头疼的地方永远一样:逻辑一复杂我就乱,改一个地方崩一片,从头到尾靠运气调试。
书里怎么说
《大道至简》里有个观点让我印象特别深:很多人学编程,把重心放在"语言特性"上,但真正重要的其实是"顺序、分支和循环"这三样东西。所有的程序,不管用什么语言写,归根到底就是这三样搭起来的。
我当时看到这里,真的愣了一下。我学C的时候背指针,学C++的时候背引用和多态,学Java的时候背接口和抽象类。结果书告诉我,最核心的东西是我大一第一节课就学过的?那我后面花那么多时间背语法、背关键字,到底图什么?
书里还有个比喻我特别有共鸣,说有些人学软件工程,就像拿着锤子看什么都像钉子——学了个新工具就想往所有地方用。我觉得我就是这样,学C的时候拿指针到处戳,学C++的时候非要把所有东西都装进类里,学Java的时候又觉得所有变量都该是private,再写一堆getter和setter,搞得代码比原来长三倍,实际上干的事一模一样。
更扎心的是书里说的一句话:"很多人不是在写程序,是在写自己学过的东西。"我想了想,我写作业的时候确实经常这样——不是想"这个需求怎么实现最简洁",而是想"这道题我能不能用上最近学的那个新语法"。能用上就觉得自己没白学,用不上就觉得亏了,宁可绕远路也要硬塞进去。
我终于想明白了
读完之后我认真反思了一下:我之前写C也好,写C++也好,写Java也好,其实思维方式从来没变过。拿到需求就开干,边写边想,边想边改。变量名乱起,结构乱来,全靠编译器的报错信息帮我指路。换语言只是换了一套报错信息的表达方式,本质上我一直是用同一种糟糕的方法在写程序。
这就是为什么我学了三门语言,能力却没怎么涨——因为能力从来不等于"会多少种语法",而是等于"能不能把一个需求理清楚、拆明白、用代码准确实现出来"。我如果思维方式不升级,学十门语言也没用。
我现在怎么做
读完这本书之后,我给自己改了几个习惯。
第一,写代码之前一定先在本子上画流程。不管多简单的题,都要把步骤一二三四写清楚,把分支条件标明白,把循环从哪进从哪出捋顺。这个习惯刚开始我觉得很麻烦,但坚持几次之后发现,花十分钟想清楚,写代码可能只要五分钟。以前是反过来,想一分钟直接写,写半小时写不出来,再删了重写。
第二,不再为了"秀技术"而选择复杂写法。用C的时候能用数组就不用指针,用C++的时候能写全局函数就不硬塞进类里,用Java的时候该用static就用static。把功能实现出来、逻辑清楚、别人能看懂,比"用了什么高级特性"重要一百倍。反正我现在的水平也没人看我代码,把自己整明白才是正经事。
第三,学新语言的时候,先忘了旧语言的写法,按新语言的方式重新学一遍。以前我学Java,脑子里全是"这个用C++怎么写,Java里对应的语法是什么"。现在我逼自己换一种思路,哪怕前期写得慢一点、笨一点,也要用Java自己的方式来思考,而不是把Java当成"加了花括号的C"。
《大道至简》读完之后,我最大的收获不是任何一条具体的技术建议,而是一句话——"语言只是工具,思想才是核心"。我之前把太多精力花在"工具怎么用"上,却从来没想过"要拿工具干什么"和"怎么干最利索"。
现在我在学Java,但我不再焦虑"Java比C++多了什么特性"或者"面试要考哪些Java知识点"了。我知道自己该练的东西跟语言没关系——是把逻辑想清楚、把结构搭明白、把代码写干净。这些东西练好了,用C写也好,用Java写也好,都不会太差。反过来,这些东西不练,学第四门、第五门语言,我还是那个会在main函数里写八百行的我。
浙公网安备 33010602011771号