编程究竟难在哪?
其实,做任何事情都很难,无论是编程、做营销活动、做商业计划、做融资、做一个手机的工业设计、写可以大量引流的公众号文章……
只不过编程难的比较有性格:
你以为你在学习编程语言,其实你在通过编程在操控一系列资源做工作(CPU、内存、磁盘、网络、显示器、浏览器……)。编程语言是渠道,本质上你需要更多的理解真正干活的那些东西的工作原理。编程语言本身不依靠其他依赖,是不太可能解决实际问题的。没有CPU、显示器连hello world都输出不出来。也许编程语言的学习会花掉一些时间,但实际上需要花更多时间放在“整个机制是如何工作”这个事情上。为此,要学习的东西是呈倍数增长。
编程往往会结合业务(人类思维)和技术(机器思维)。这两类思维的差异非常明显。著名的“让程序员:去买6个苹果回来,如果看见西瓜就买一个“就是这种问题。开发者要用人类思维去理解PM的要求,同时又要根据严谨的逻辑去将方案转化为可以实现的流程图、状态机。这还不包括抽象、因为成本的考虑做成取舍之类的考虑。有人说,我做纯技术(比如数据库、中间件)就不用考虑业务了。其实那时候的技术需求就是业务,比方说想让数据表可以存储json类型,中间件可以跨不同平台工作……
编程大部分时候是一种群体工作,需要密切合作。前端开发、后端开发、数据开发、测试、PM、设计师等一群人集体完成一件事情。一个人通杀一切的时代早已经结束了。而一群人一起工作就要协作,需要保证彼此理解一致,就需要流程、文档、协同工具等。做其他行业,比如营销策划也需要协作,不过编程里的协作因为涉及到到的信息量和精确性都很高,必须采用更复杂的工具和流程,而非几个人找个会议室开个会聊下基本上就可以解决问题。
当然,还有些领域的群体协作比编程复杂的多的多,比方说造飞机,发车登月飞船
编程因为解决问题的需要,会用不同的方式看待这个世界,并且做独特的抽象。这些抽象是大量实践慢慢积累的结果。比如“线程”,“文件”,”锁“, “Object”,“Actor”,“Function”、“Future”、 “Promise“, ”Generator“,某种“模式”……,这些概念的有的有现实实体的对应关系,但是要进一步理解实际的意思还要多花一番功夫;有的压根在真实世界里就找不到对应的关系,完全是人类智慧的产物。为了理解它们需要反复实践,找到这些东西的场景,反复琢磨才能慢慢领悟。这需要耗费大量的时间和精力。
也许有人发现自己在编程过程中没有/很少遇到上面的问题,觉得编程很简单。总是能够按照类似的方式一遍又一边的写代码来赚取收入。我很遗憾,这种叫做“流水线编程工人”,永无出头之日。毕竟对你简单,对别人也同样简单。门槛对所有可能的参与者是一样的。
如果真的想跳出来,真的以编程为事业,那么并没有什么捷径可走,下定决心去学习、思考,并在痛苦中努力成长,能够做其他大部分人都做不了的事情。这个方法也同样适用于任何职业。
相关问题:
大宽宽:金融IT需求过多并且复杂,团队敏捷开发并追求交付效率,导致技术负债过多,有没有什么解决方案?我觉得难的是写文档,做ppt,吹牛逼。
编程一点都不难;它只是和你十几年来在学校受的教育格格不入而已。
自小你受到的教育,总是:
1、记忆和理解一个个的知识点
2、给你一个未完成的拼图,让你把自己记忆的、某几个合适的知识点以正确的姿势放进去(超过三个就是难题,超过五个就是压轴题!)
3、好了,满分
换句话说,你从未学过创造;你只是被训练的极为擅长“填补拼图中缺失的一角”而已。
看我的这个回答:代码是如何控制硬件的?
嗯,显示所有答案,你会发现另一个怼我的答案排在第一。
他说,“高票答案没有真正回答问题”,而许多许多人表示同意——而且非常反感那些装X的答案,以至于要狠狠踩上一脚。
搞笑的是,他的答案也被很多人认为“没有真正回答问题”。
终于,我知道这些人缺失的是哪一环了。于是不得不添加这么一段回复:
解释下这个抽象的0/1是如何出现/消失于电路中的。
事实上,电路中压根就没有0和1。
就好像你手机充电器的指示灯一样,当它接通电源时,指示灯亮;拔下来扔桌子上,指示灯灭。
很多人胶柱鼓瑟,非要在里面找“充电器是怎么知道自己有没有插到电源上的”。
但实际上,我们每个人都知道,指示灯就是盏灯而已。接到电上,它不亮也得亮;拔下电源,它想亮也亮不了。
同样的,电路中压根不存在什么0和1。我们给它插电,然后合上开关,某段电路便得到了供电——然后我们给这个状态起个名字叫高电平。
它和充电器一样,是一件死物。它压根不知道任何东西。
但我们需要知道它的状态。所以我们不得不在电路中接入指示灯(或电压表),然后根据指示灯的明灭,我们才知道电路是哪个状态。
进一步的,聪明的人类把“指示灯”做成0或1的形状,就把电路状态以一目了然的形式表现出来。
甚至于,我们还可以把它转换为屏幕上的图形/字符、音箱中的声音,从而间接的看见/听到电信号。
再说一遍:电路中不存在0和1。它们只是按基本物理规律运行而已。为了方便我们理解,我们才想办法做了一些“高级指示灯”,从而使自己能以0/1甚至汉字/图像的方式直观理解电路状态。
太多人严重缺乏这种最基础的动手能力,不知道人才是本体,这才总是傻乎乎的想找到“电子器件究竟在哪个点获得了智能”。
可笑吧?这么个幼儿园级的简单问题,得如此长篇大论才能说清楚——显然,他们甚至压根就没有把一个幼儿园级的问题表达清楚的能力。因为能说清楚他们自己就会完成思考了(这也是那个认为“高票没有解决问题”所以自己走低彻底解决了问题、然而还是有人在他的评论区疑惑“0/1怎么对应到高低电平上”的原因)。
幼儿园不解决;现在,想要教会他们,你就必须彻彻底底的掰开、揉碎,像喂两个月的婴儿那样一点点给他们喂!
实质上,这已经等于教不会了。
当然,这个问题实在太简单、太初级;大多数人在他们上幼儿园之前就已经解决掉了。
所以,读到上面那段文字,你可能无法感同身受。
那么,这段呢?
我们高中数学为什么不重视算法?高中学的数列,三角函数,求导,圆锥曲线相关问题的解法和算法有什么关系?
编程不难。但它要你创造。
过去你已经习惯了的、出题人准备好一切、只留下一两个缺口让你补充拼图的“思考”方式,在这个领域渣都不是。
听着,你不需要学习什么“语言”。C/C++、Java、Go、PHP、Python……统统用不着。
你只需要知道,程序语言有顺序分支循环三种控制结构、与或非三种逻辑——剩下的,统统靠你自己。
不。你就是再读一千本书,也甭想靠这个把“编程的技能”直接灌进你脑子里。没那好事。
相反,你必须自力更生,你必须靠着“鄙陋”的顺序分支循环和与或非以及中小学水平的数学运算支持,解决手头的一切问题。
你学的是编程,不是编程语言。
脱掉C的底裤,并不能帮你写出哪怕一个简单的鼠标驱动程序。
混知乎或其他网络论坛,总有人忍不住骂“你们码农怎么什么话题都想插一嘴?”
很遗憾。但程序员的工作,恰恰正是“理解各行各业的工作,然后把它教给电脑”。
没错。
学编程,学的甚至不是计算机本身;相反,它要求你从声学到视觉暂留、从结构力学到滤波解调……随便哪行哪业,你都要能够快速抓住重点、然后把它说的清清楚楚明明白白,这才可能把它教给计算机、让CPU代替人工作。
如果连“手电筒的原理”你都理解不了、如果连“遥控小车”这样简单的发明你都做不到“信手拈来”……那么,他人从液体分层原理借来的冒泡算法、从猜测的人脑工作原理偷来的神经网络,你又怎么可能理解?
它要求的,是“从三百五百甚至成千上万个知识点中挑选出最合适的那几个、然后用它们解决你所面对的问题”!
编程真的不难;但你从未受过解决问题的训练。
而编程,恰恰就是最最纯粹的、以精确无歧义的方式表达问题解决方案的一种工作。
不。
你甚至不知道“学习编程”就是学习“如何用电脑解决问题”,反倒学编程语言本身去了……
这种学法,怎么可能不难?
其实不是太能理解所谓 好多语言就算学很久也可能不会 的说法……
——————————————————————————————————
声明变量、函数、类、接口、常量
顺序、循环、判断
赋值、调用、实例化、继承、实现(接口)、引用、反射
除此之外一门语言还有什么东西呢……
为什么会很难学会呢?
比如 php(https://www.zhihu.com/question/39078661/answer/109436356)
——————————————————————————————————
我觉得很多人觉得编程难……大概是难在不知道怎么处理问题吧……
面对一个问题的时候,怎么去分析他、怎么去拆分层次,怎么把每个层次写成程序。
这其中就涉及到了很多思想的问题,而和语言无关了……
算法、设计模式、数据结构、面向过程/对象/切面 、数据驱动……
环境、外部依赖调用、协议 、数据库、缓存、分布式、大数据……
@invalid s 大佬说了关键点,这里算是做一点补充吧
编程难么?对于有些人来说确实挺难的,我在大学里见过许许多多靠背代码过程序语言专业课和二级C的同学,其中不乏优秀的同学,比C语言难100倍的模拟电子技术、高频电子技术、通信原理他们能考很高分,但C语言就费老牛劲。我考二级的时候带了一支笔悠哉悠哉的就过去了,看到走廊上一群拿着辅导书玩命翻的人,很是迷惑,有那么难吗……
后来我也算是略微想明白了一点,这是“学以致考”和“学以致用”的区别
编程学习跟应试教育是完全互斥的学习方式,应试教育那一套不用管理解,只管背概念-背题型-做题拿分的流程在这里是玩不转的
在应试教育模式下,你可以不懂期望、方差等一系列概念是如何被发明出来的,可以不懂微分方程有什么用,可以不懂戴维南定理、H参数等效电路拿来干啥,不理解,不影响你套题型套公式求出正确的解,拿到分。
但是对于编程来说,“不理解概念”的负面反馈是及其迅速和强烈的。因为编程没有“题型”和“公式”可以把你解决问题的过程简化成填空,编程提出的问题相对来说是很宽泛的,需要你根据脑子里的逻辑推断,利用所学编程语言的各项功能组织成代码去解决问题。当你不理解概念的来由和用途的时候,你根本就想不到用它,也解决不了问题。
比如你不理解指针,那么涉及结构体、链表、文件操作等知识的内容你统统都会难以理解,更别说编写程序了,面对一个空空的main函数,你都不知道要不要用指针,背了*p是指针,&p是取地址,背几行操作指针的代码,又有什么用呢。
学习编程语言就像你学习卷尺锤子扳手怎么用一样,只是学习工具使用。任何一道试题和现实中的需求,都是在考你用工具解决问题的能力,而不是你对工具本身的了解。每一行代码都是人如何使用多种工具达成一个目的逻辑过程,只要你有一行代码,甚至于一个关键字、符号不理解,你写出的程序就可能出错,而计算机是个很简单的东西,不对,就不过,不会给你步骤分。
理解每一个概念的来由、定义和用途,是学习编程语言的最基本的要求。
我自己在大学里辅导过不少C语言老大难的同学过二级,我从来不让他们刷题,而让他们拿看不懂的程序给我,我一行一行的给他们讲代码为什么这样写,查找他们知识点的缺陷,帮助他们理解,最后他们考过二级也都是凭借着用自己理解的概念写了能写出来的程序,而不是蒙到考题把背好的程序从脑子里贴上去。
另外一个重要的点就是要“用”,这点包括很多已经工作的同学都在犯,喊着“我要学C++/Java/XXX”然后抱着一本大砖头开始啃,啃了两章就没下文了,为什么会有这种现象,学了,能懂,但不知道怎么用,不断学,却练的少,最后在迷茫中打出GG,编程语言是个蛮复杂的工具,不要指望一蹴而就,当你刚掌握还不熟练的时候,不用很快就会生疏。
为什么很多人推荐一边看开源项目一边做练手项目来学习,就是为了填充从“学完工具怎么用”到“用工具解决问题”之间的鸿沟。
题主说C语言难学,我不知道题主是不是还在上大学,据我身边的情况来看,国内大部分大学的C语言教学质量是很堪忧的,包括部分985。以至于身边很多同学学完C语言课程之后,居然不知道#include
如果你C语言的基本知识都很成问题,那么请丢下编著的教材,可以去找国外教材但是不推荐大砖头,或者在网上找公开课,把学习重心放到理解概念上,我个人推荐 C语言入门教程-C语言中文网。
如果你是在拿C进阶实践上产生了疑惑,那我推荐一本书 Unix/Linux编程实践教程 。按着这本书上的章节去一个一个实现Linux/Unix上的各种系统命令,看看“C语言除了考试还用来干嘛”,“正儿八经的C语言程序怎么写”。
C++和Java相比于C,理解面向对象程序设计是一道坎,这一道坎,需要你用代码堆过去,空想是没有办法理解的,做题也没有办法理解,面向对象是为了应对有规模的工程如何组织代码而提出的概念,想要理解,也应该去看看上规模的工程是怎么用的,推荐自己一边学一边做点小东西,比如用Qt做桌面应用,拿Java写点Android Demo等。
第一等级的编程难,和学英语是一样的难度:记不住单词/命令/库/best practice(这个中文应该叫什么?)。
大部分爱好者和手写代码一万行以下的,卡在这个阶段。这个没办法的,不可能有捷径解决,只有去练。相信21天学会JAVA的,和相信知乎live5小时精通雅思单词的一样蠢。
第二等级的编程难在生态,C++还好点。现在连JS都讲究生态,别说微软系和JAVA系了,从前到后一大堆,以前写JS开个notpad就可以,现在装个nodejs就劝退一堆人。编程的生态环境现在已经十分复杂了,这也造成了隔(语言)行如隔山的状况。
这一级主要是初级人员往中高级人员进步遇到的槛,解决方案是自己投钱投经历,把本行主要的生态环境在自己家里搭建起来,摸索摸索。
第三等级的编程难在思维。很多人语句熟悉了,生态熟悉了,脑子还是人脑。拿到一个需求,就在脑子里把中文的英文的需求,翻译成JAVA的,C的,JS的。这是阻止大约SDE2/P6这个层次往架构去的主要原因。计算机编程的一大特点就在于对自然世界的抽象,提炼和优化,而单单平等的翻译,是做不到一个好的人员的。
最后的一个编程难度在TMD和蠢货沟通上。脱离了单纯开发工程师到了技术专家的角色,你面对的是无穷无尽的蠢货的问题。“为什么再加点内存不会更快?”“为什么加一倍人开发时间不能缩短一倍?”“为什么你们的软件不能侦测到服务器死机了重启服务器?”TMD我这是JAVA好吗!重启服务器你去找Oracle ME啊,蠢货!
1. 难在思路的构建
你学了很多语法,很多 API,但是当给你一个实际问题,让你通过编程实现,不是简单地罗列 API 即可完成,而是需要你对问题进行分析,理清解决问题的逻辑,然后再通过各种算法、数据结构和 API 等进行编程实现。
2. 做出来容易,做好难
当你解决了思路构建的难点,解决了一个问题,但是你是否使用的最好的方法,这就是所谓的做出来容易,做好难。
写的程序能够解决问题且没有 bug 是基本要求。这里的做好不是指功能正确,而是写的程序容易理解,能够很容易让其他接手的程序员(水平不差)看懂为什么这么写。
正确是现在怎么写不会挖坑害将来的人,现在怎么写能让别人1年后看你代码时候不可能理解错你现在的意图,现在怎么写能在别人将来犯错的时候提示他你错了。
编程是给未来的未知人讲故事,你无法知道将来这个人是谁,他都懂什么,他经历过什么,这个系统将来已经是什么样子了。我们需要在这种无知,缺乏信息的情况下做决定,从千万种把这件事做出来的方法里,选出你觉得最能把这个故事给讲好的那种方式,把故事写下来。
编程是一种沟通,用程序跨越时空之沟通则是一门属于程序员的特有的艺术 —— 阿莱克西斯
3. 规范性好,有良好的可扩展性
并且程序的可扩展性,规范性高,后期维护难度小。整体功能实现的过程中,各种情况考虑规范。
其实学习编程和学习其他内容一样,没有什么太大差别。心态放好,用对方法,你就能够学好。重要的是学知识的人是什么样子,而不是学的是什么。
在这给你一些学习编程的建议,希望对你有用。
1. 让编程成为一个习惯
想要培养一项技能的最好的办法,就是将他融入到我们的生活并成为我们的爱好。其实说白了,就是让这个爱好成为一个习惯,一天不去做这件事情,都会觉得少了什么。在不知不觉中,这个习惯会像滚雪球一样积累起来。
对我来说,养成这种习惯首先就是要对“拖延症”说不。比如,你想锻炼下自己的写作能力时,但是没有好看的本子,没有好的灵感,没有安静的环境....总之就是找各种理由一拖再拖,最后就不了了之了。
为自己设定一下,每周拿出几天,每天拿出几个小时,编程学习就这样慢慢步入正轨。
2. 将每天的学习过程拆分成小块
对待编程学习,我们没必要像健身狂人那样一口气做到筋疲力尽。与其直接编程2小时,我们完全可以先做40分钟、然后休息5分钟,整个过程重复4次。很明显,40分钟这样的短周期更容易坚持也不会带来多少压力。
不过这样的方式应该配合更为灵活的执行思路。如果你感觉状态很好,而40分钟才刚刚完成热身,那就继续做下去并努力让自己抓住这种状态。向大家推荐蕃茄工作法,这是种学习新型技能的良好机制,推荐各位认真了解。
3. 学好基础知识
在确定好学习方向和技术栈之前,你可以多做尝试,学不同的语言。但是当你学到一定程度,知道自己对哪个方向更感兴趣的时候,就不要广撒网了,一定要专注于你所选择的领域,做深做精。认真系统化地学习相关语言知识。当然,这不是让你就知道看书,你要看书的同时结合项目实践,进而对自己的掌握程度得到反馈,知道自己哪里不足,再继续学习,如此反复,详见第四点。
4. 学练结合,从做项目中找知识漏洞
当你选好方向,认真学习基础知识后,学习一部分的知识,就结合项目做一些实践,已明确自己哪里不足。并且做项目能增加学习乐趣,给自己提供一些正反馈,让学习变得有趣,让自己有足够的动力继续学习。
5. 阅读别人的代码
学习编程不能闭门造车,经过这几年的编程学习,我认为想要提升编码水平的最佳途径就是多看、多写。看别人的代码,看一些程序员大佬写的代码,看一些标准库的源码,仔细思考他们的编程思维和编程方式,以提升自己的编程思维和编程方式。阅读别人的代码也确实是快速提升代码水平的一个技巧。
6. 寻找良师益友
学习编程的一个很好的方法就是和其他的程序员交谈。这不仅能够帮助我们多获得一种思维方式,同时也能够以更为愉悦的感受完成学习任务。至于内容没有特定的要求,可以是你正在学习的东西,也可以是你认为很酷的东西,更可以是你正在工作的东西。这样做可能会让你学到很多关于库,服务,编程语言和模式方面的知识。但是,最重要的是,你能了解到其他人是如何看待编程的。
7. 写技术文章
如果大家学习了一种新的编程概念,但不能确定自己是否已经真正掌握,可以写技术博文加以检验。或者是在技术博客网站上搜索,找找是否有人提出了类似的问题,然后给出您自己的答案。如果答案不对,那么讨论的过程能够有效加深理解。这样的过程,能给我们带来宝贵的经验,同时也能帮助他人。
值得提醒的一点,别因为自己刚刚涉及编程而有所顾虑。罗马不是一天建成的,出色的程序员也是一样。只要您对问题有所了解,就不妨给出自己的答案——无论对错,这都将成为一次宝贵的经历。
8. 保持耐心
对于人生来说,其中任何目标的实现都离不开耐心。编程学习就如其它任何学习任务一样,都需要反复努力并投入大量时间。
在这个过程中,你一定会经历高潮与低谷——别被这些曲线影响了心情。接受已经发生的一切,并尽可能避免其中不好的部分。就像打高尔夫球一样,我们的手感总在不断浮动,但只要坚持到底,你最终总能成为一个大神呢~
我的其他相关回答:
- 怎么学好数据结构?
- 程序员如何提高生产力?
- 初级程序员,该如何提高?
- 如何才能做一名自由职业者?
- 程序员上班有什么提高效率技巧?
- 如何学习编程?顺便介绍些好的网站
题主说程序语言学很久可能学不会,让我们理一下语言的发展过程。
机器语言
计算机的世界是 0 与 1 的世界,如果编写过机器语言,你将会有更深的体会。让我们先看下边的代码片段。
为什么叫机器语言?这可以说很明显了,这段代码猜到下个世纪也猜不出来吧,真的是字如其名,机器才能懂的语言。
这每一条都是一条指令,这个每条指令总共是 32 位,前边 8 位可能表示这条指令是加法,后边 12 位可能是第一个加数的地址,再后边 12 位可能代表第二个加数的地址,然后结果可能保存到第二个加数的位置。
只是随便举了个例子,每条指令的规定是什么,当然就取决于硬件了,有单地址的指令,双地址的指令等等,犹记得当时计算机组成原理课设中,机器只提供了加法的指令,循环的指令,没有乘法的指令,3 * 5 怎么算嘞? 当然就可以转换成 3 + 3 + 3 + 3 + 3 了,还有除法怎么办呢?依旧可以实现的,记得当时写了满满一张纸的机器指令只为实现除法,用着高级语言的我们可以说是很幸福了。
这里我们可以看到,硬件和软件之间的相互配合,硬件如果没有实现,我们可以用软件,凭借硬件已经提供的功能和我们人类强大的逻辑,实现硬件暂时没实现的功能。当然软件实现的话速度和效率方面肯定会比硬件直接实现差一些。那为什么不用硬件把加减乘除乘方开方都实现了?这硬件的开销、复杂程度太大了,在速度可以容忍的情况下,乘方开方这些还是用软件实现比较好。
汇编语言
程序员如果每天写着 10101001010 ,大概会疯掉吧。于是第一反应就是,我能不能把这些指令用英语单词表示了,之前 10101 代表加法指令,我直接写个 add 岂不是更好?于是汇编语言出现了,它的可读性比机器语言增加了很多,可以看下边的代码片段。
我们终于能看懂些了,mov,loop,sub,add 等等都是见名思意,每条指令几乎和机器指令一一对应,这样只要再拥有一个类似「翻译器」的东西,把它翻译成机器语言就完全够了。
但是!!!!我们还可以看到 ax,bx 这些东西,他们是 CPU 中的寄存器,还有一些 0b800h 啥的,这些是内存的地址。可以看到我们仍旧直接面对硬件在编程,这样的好处当然是程序的速度会快一些,缺点当然是对程序员的不友好,我们只有懂了硬件才能进行编写程序,于是,面向我们程序员的高级语言渐渐诞生了。
C 语言
这可能是大多数人的入门语言了,让我们看一下它的样子。
这看起来就非常的舒服了,即使一个没有学过编程的人,基本也能猜出来这是在干什么。是的,它是在计算 1 * 2。但大家有没有想过,有了这段程序,机器看不懂呀,是的我们还需要一个能够把我们编写的 C 语言程序的代码变为机器语言的东西,我们把它叫做编译器。
编译器无非是一个软件,那么,我们用什么语言写呢?其实,在 C 语言之前,已经有了 A 语言,B 语言,我们不妨选择一个在当时用起来比较简单的 B 语言来去实现我们的编译器。等等等等,B 语言写出的程序用什么去编译成机器能够执行的程序呢?用 B 语言的编译器!!!那么 B 语言的编译器哪来的,用 A 语言写呗。
前边一段话比较绕,大家理一理。终极问题,A 语言的编译器呢?用汇编语言!!!是的,逻辑就是我们先用汇编语言写一个相对容易实现的语言的编译器,有了这个编译器我们就可以实现难度更大,更抽象语言的编译器。最终,一层一层的就实现了 C 语言的编译器。
当我们有了 C 语言的编译器,意味着我们用 C 语言写的任何程序都能够转化成机器语言去运行了。这时,我们甚至可以再用 C 语言写一个 C 语言的编译器,再用之前写好的 C 语言的编译器去编译它,一个新的编译器就诞生了,哈哈哈哈哈,好像绕口令。
知道了这些,我们现在甚至可以模精品其他语言设计的规则,然后自己实现一个编译器,然后属于你自己的语言就诞生了!当然说着简单,做起来就比较烧脑了,具体的可以去学习编译原理的东西。
语言分类
C 语言出现后又陆陆续续出现了很多语言,而它们的编译器也大都是用 C 语言去写,底层很多东西也去用 C 语言实现,C 语言可以说是高级语言中,离硬件最近的语言了。
编译型语言
常见的 C 语言,C++,C# 等等,这些语言都需要编译器将所有的东西翻译成机器语言,形成可执行文件,例如 windows 下的 .exe 文件,相对于解释型语言,编译只做一次,然后就可以多次运行了。
还有比较特殊的是 JAVA ,它的一大优势是跨平台,也就是他的代码写好以后,编译成 .class 文件, 然后只要机器里有 JAVA 虚拟机,不管你是什么操作系统,window 也好,linux 也罢,它都可以执行,所以实现了跨平台。它可以说是编译型和解释型语言的结合了,它没有直接编译成机器语言,而是先变成 .class 文件,再由 JAVA 虚拟机一条一条解释执行。但他的语法风格和 C 语言也有很大的相似之处,所以我也把它放到这里了。
解释型语言
常见的 python,JavaScript,Ruby,或者称他们为脚本语言,这种的话就是需要解释器,它是一句的一句的通过解释器将其翻译成机器语言去执行,很明显,在运行的时候,如果不做特殊的优化,它的速度肯定比不上编译型语言。
标记语言
常见的 html,xml,和上边两种完全不一样,它的作用主要是描述一些东西,然后用于显示或者传输,例如下边的 html 。
它不能做一些加减乘除的事情,它仅仅供浏览器读取,然后根据相应的语法把它显示出来。就是下边的效果。
说了这么多,我们怎么学一门语言呢?
我认为这取决你要做什么,不同的语言其实语法大同小异,不同之处在于它们的生态圈,它们所提供的库的方便程度与类别的不同,以及它们各自的一些特性。
如果你要写一些 windows 的桌面程序,你当然可以去学习 C++,C# 等。如果你要写安卓,你当然得学习 JAVA。如果你想写一些自动化的脚本,帮助你做一些事情,你可以学 python。如果你想做一些面向硬件的编程,C 语言当然是不错的选择。
不管你最开始学的是什么语言,都不会影响到其他语言的学习。我们要把语言当成一门工具,它是为我们服务的,需要啥就学啥呗,并不需要畏难。当你用熟了一门语言后,再上手一门语言会发现很快,快则两三天,慢则一周便能游刃有余。
你知道 C 语言怎么产生的吗? 写 UNIX 的时候,Dennis Ritchie 觉得 B语言所编译出来的核心效能不是很好,于是将 B 语言重新改写成 C 语言,再以 C 语言重新改写与编译 Unics 的核心, 最后发行出 Unix 的正式版本。是的,就是这么随便,另当代学生「头痛」的 C 语言,就是这样简简单单诞生了,惊不惊喜,意不意外。
而现在很火的 JavaScript 当时也是 Brendan Eich ,为了应付公司安排的任务,用10天时间就设计出来了。
让我们看一下最新的编程语言的热度吧,https://www.tiobe.com/tiobe-index/
看上边的语言,很多可能连名字都没有听过,但事实是他们在各自的领域都发挥这很重要的作用。
学一门语言,首先要明确你为什么要学它,然后再去学。为了考试?为了做一个应用?为了写一个脚本?不管怎么样,有了这个目标导向,我们就会有动力。
我学编程期间开始也觉得很难,迷茫,因为刚开始接触方向实在是太多了,之前写过我的一些想法。
给初学者的一些建议。
windliang:大学的计算机之路自己做过的一些应用,大家看看可以产生一些灵感。
你是在何时感觉自己的编程水平完爆身边大多数人的?下边是一个应用诞生的全过程。
windliang:小程序神奇字体的从零到一下边这本书强烈大家看一下,也就是学习方法,学习任何东西的方法。
windliang:《刻意练习》有感如果没什么想做的项目,可以刷一刷题。
LeetCode刷题
最后总结下,我自认为不是算聪明的,记得刚开始的学习的时候,有时候一个知识点看了一遍又一遍才会理解,写一个阶乘的函数都会兴奋,但就是一点一点的积累,自学能力和网上找东西的能力越来越强,慢慢的做东西变的快了,即使自己没有接触过的东西,也不会畏难,相信自己可以做出来,只是时间的问题而已了。你学的越多的时候,会发现不会的也越多,自己现在离大神也好远,但此时不会在迷茫了,因为此时知道自己该做什么,要做什么了。
所以学习编程我觉得最重要的就是兴趣和多做多做多做多做多做了。
其实我没学之前也觉得难,等学了一段时间之后我觉得挺简单。
之后一直都觉得编程根本就没有什么难的点,真正难的地方,都不属于编程的部分。大部分跟我说难的人,基本上都是不想学,不认真的,他们只是不想去思考而已。
直到我碰上了一个学生。。。他其实学习蛮认真的,很积极,很愿意问问题,但是他真的是一个让我体会到绝望感的学生。。。那个时候一点点编程里的基础概念,我用了可能七八种不同方式和角度来解释,连旁边来问问题顺便听了一点的几个学生都已经搞明白了,他还是不能理解。。。最终我只能放弃了。。。我在内心建议他换个专业吧。。。
那次之后我仔细考虑过编程里面到底有没有难点。我的结论是,有的。但是编程里真正的难点,按理来说在之前的教育里应该已经被训练和克服了。编程用到的最基础的思想工具其实基本都可以从最基础的数学教育里学习到。除非你当初学数学的方式不正确,否则小学应该就能获得基础的思想工具来编程了。
编程在思想上有两个难点,一个是要懂得抽象,另一个是逻辑要严密清晰。
所谓抽象,拿个最基础的例子来说。最早期开始学习数学的时候,我们会教,如果你有两个苹果,然后妈妈给了你两个苹果,你现在就有四个苹果啦!这里其实就已经隐含了关于如何进行抽象的教育了,把具体的苹果,抽象为抽象的数,忽略了苹果的绝大多数特征,只保留它关于数量上的特征。编程里时常要使用类似这种抽象的方式,提炼出需要的部分,然后在编程范式的框架里表达出来。如果始终无法理解两个苹果跟数字2有什么关系......那真的没法编程了。
另外一个是逻辑上必须严密清晰。日常生活里很多经验性的认知往往是直观和混沌的,我们在描述的时候往往是不清晰的,而且我们已经习惯了这种表述和认知方式。编程的时候不能那样去认知,必须有严密清晰的逻辑。打个比方,我不知道你们有没有经历过,但是我妈逻辑特别不清晰。比如说我开车,问她在哪里停,她会跟我说,在前面停。我会问她,在前面哪里,可不可以给一个大致的距离评估,或者给一个标志性建筑,或者你跟我约好停之前多久喊停。她就会很不耐烦......
如果是懂得如何抽象思考,并可以判断出怎样的表述是逻辑清晰准确严谨的人,是不会觉得编程难的。尤其是在现代软件工具的帮助下,编程本身是非常简单的,因为可以分解成一步步来进行,心智负担特别小。比什么下棋啊,数学啊,算法啊,那种需要大脑承载大量信息进行推理,分析判断的问题要简单多了。
现有很多答案道出了大众进入编程领域难在哪里。换句话说,就是入门的难点。
我补充一下对于驰骋在编程战场上的人来说,真正的难点在哪里。
关于这一点,或许每一位将军的看法不同,但我比较赞成这句话:
There are only two hard things in Computer Science: cache invalidation and naming things.
-- Phil Karlton
翻译过来就是:计算机科学有两大难点——缓存失效和命名。
出处
bliki: TwoHardThings至于为什么这么说,一言难尽,领悟的人自然懂得,没领悟的人要么是还没达到境界,要么是已经超越此境界了,当然也有自以为超越了此境界其实还没达到境界的……
好了,我要继续这周还没完成的工作了——想想我接下来要写的这个模块应该叫什么名字……
编程都不难。你学不会因为编程有一个学习曲线。你必须坚持学习至少150小时左右才能入门。假如你没能坚持到150小时,那肯定学不会。当然也可能是你的教程太烂。
难在耐心。
编程甚至对智商都没什么太大要求,对耐心与认真要求才是最大的。
实现一个简单的功能,就需要小心翼翼的操作每一个变量,设计每一个函数,设计每一个模块,耐心的写每一个测试,最后细心的debug认真检查程序运行的过程。而在学习编程的过程,也要耐心地读文档,读不懂倒回去再读或去寻求他人帮助。别人的代码一行一行的看,看不懂自己想办法跑一跑观察一下想办法搞懂。
现代人们习惯于快节奏的生活,做很多事缺耐心和毅力,心也不静。有很多人甚至连吃饭都没耐心,而编程这项活动却是世界上最需要耐心的事之一。所以很多人说难,是因为大多人没有耐心,没有极客精神。
极客精神就是耐心,对困难问题的耐心。面对难题非但不放弃,反而很兴奋。这些都是技术大牛的特质,也是我们常说的天才。
现代编程有了高级语言,其实已经简化了太多。我有时候没耐心了,就去想想几十年前,前人的打孔编程,插线编程。他们需要的耐心比我们现代要多几十倍,但他们把火箭送上了天。再想想自己有python,Go什么的,却没有什么大成就,就意识到了自己还要培养耐心。
私以为编程的难点把具体的事件抽象成模型。
c、c++、java、python这些语言本质上没有太大差别,一般科班出身的程序员都是从c入门,其他语言基本自己看看就会。很多时候理解一件事就是一个想法的转变。首先人是通过语言交流的,而机器的语言就是01,也就是数字。而跟数字直接相关的就是数学。所以我们首先将人类世界中的某一个具体的事件用数学公式表示出来,然后用计算机语言将数学公式工程化落地。
理解了我们的目的是什么,再去了解怎么用c、c++这些工具去实现这个目的。
看过一些大佬们的文章之后,发现他们虽然研究领域不同但对于问题的归纳、总结、演绎、验证的方法等都是相通的。是一种科学的认知体系。后来我自己学习摸索的过程中也发现应该是中国的应试教育的弊端,就是没有培养一个正确认知世界的方式,只是在灌输内容。以至于很多人出了学校,没有老师或者其他人的督促,就没办法掌握的新的知识。
所以说有什么好的方法。我有个很认真的提议,讲真,不开玩笑。据说现在幼儿园都在学Python,我建议可以先去看看插画版的编程教程。必须解释一下,我觉得现在小朋友们的教育比我们那时候更人性化,更符合认知规律,从简单的开始,想通了再回头看晦涩的大部头会有茅塞顿开的感觉。
编程本身一点都不难,难点应该是将一个具体的情景,抽象量化出来,并理解为什么这样做可以逼近目标值,之后落地成程序。
难在心急。。。。。。。。。。。。
真的,都太心急了。。。。。。。。
就像学数学,加减法小学的时候,要天天练习,才能在学乘除法,乘除法也要写好多题,才能学方程。。。。。。。。
其实编程正常来说,也是这个道理,数据结构和基础算法(不说那些太难的,就说排序的那几种简单的)都没学会,然后就开始学掉包。。。。
以前有非专业的人想学编程,我给推荐的,一般都是多花点时间,刷刷数据结构和算法的基础题,然后看看怎么操作文件,读写,最后在看看TCP UDP的代码,别起手,就上什么numpy pandas,mysql ,redis,掉包urllib库。。。。。。。
但大部分人,根本就静不下心来,感觉人家百度上的代码,用这个库,可能就2 3行就OK了,为什么我要听你的,自己手撸呢。。。。。。
没什么办法,那就愿意掉包,就掉呗, 人家包里面,为什么传这些参,参数类型为什么是这个,都不懂,纯靠背,纯考提示写,出了BUG,自己还不懂,继续百度,百度半天还不懂,在去问人,其实都是基础的问题的,过一段时间没人愿意解答了,自己也就坚持不下去了。。。。。。。
剩下的,也有智商逻辑的问题,的确,业务逻辑太复杂,有的人搞不明白,几层嵌套就完蛋。。。。。。
编程的难分为两类,一种是工程上的难,一种是算法上的难。
我先回答一下工程上的难:
我们做一个比较, 就是开发一个大型软件, 和设计并建造一栋摩天大楼, 究竟哪个更难, 为什么?
实际上这个比较一旦抛出, 软件开发的"难"就立马显现出来了。
摩天大楼一旦盖起,将不再,也不可能“更新版本”,更不可能在建筑结构上进行“重构”,比如一个一百层的摩天大楼,不可能说过两个月发现地方不够住,然后再加五层,又过了两个月发现某个房间的设计满足不了人们日益增长的需求,将整个房间扩大两倍,究其原因,就是因为“建筑”这个东西太不灵活了,你如果想“重构”这个摩天大楼,几乎只有一个办法:炸毁,推倒重来。
而对于软件来讲,它本身的一个灵活性,导致了它可能在不破坏原有的大部分功能的前提下进行一定的功能性改造,在改造的过程中,原有的一些功能模块的更改,可能导致之前的一些文件或环境, 或应用程序在这个新的版本下出现不兼容的现象,所以它要保证旧的东西在新的东西下能成功运行。
一个东西越是牵扯的东西多,越和环境耦合,和“用户”耦合越深,和“自身”耦合,和“历史”耦合越深,它的“更新”就越难,而“重构”是多次更新之后的“必然结果”。
这就是为什么摩天大楼几乎无法进行功能性更新,因为建筑这个东西本来就是一个“超级耦合体”,你改变墙壁的厚度,会减轻它的重量,但于此同时因为墙厚度降低,它本身的抗压刚度和抗扭刚度也发生了降低,所以后果可能还需要重新计算,墙里面的电线会不会因为墙的厚度改变而需要重新布线?而且不仅如此,墙的厚度还会改变房间的大小,这是它和其自身的高度耦合。
它和用户的耦合性也很深,因为这个房间的一些地方有可能早已住了人,原有的位置放置了很多用户的东西,比如一些很重的家具等,你对墙重新施工,就意味着你要强迫用户更改它们原有的使用习惯,甚至可能让用户原有的一些家具无法在新的版本中放进去,这是用户的耦合性。那么类比软件,比如我们都知道的excel,这个软件开发了二十多年,你在2003版的excel里编辑的,十几年历史的excel文件,你觉得可以在2018版的excel中打开吗?这听起来很不容易,但是微软做到了,这就是为什么说现在除了微软几乎没有公司有能力开发出这样的软件,原因之一就是它变态的兼容性,长达十几年的时间跨度,版本跨度,保证文件的兼容性,这本就很了不起。
所以向前兼容是软件开发的主要难点之一。
有时候不仅是某个功能模块的更新,随着一个”服务型“的应用不断发展,它要提供服务的用户量就会不断提升,一个典型的例子是淘宝,学过数据结构的我们知道,这世界上很多东西的复杂性并不是线性增长的,简单的例子就是排序,最优的时间复杂度也是nlog(n),理想世界如此,现实世界怎么可能更简单!
十年前php可以撑起淘宝的流量,而今天呢?php的性能问题恐怕让其无法再承担淘宝的亿级流量,所以只能用java重写,而这就是重构,重构其实就可以认为是推倒重来,代价很大,需要更换技术栈,但必要时不得不做。
有人说服务一万人用一台服务器,那么服务一亿人用一万台服务器就解决了,哪来那么多事,而这也正是我刚才说的,陷入了”线性增长思维陷阱“。
一万人的时候,可能有时候可以让系统停掉,进行一到两小时的服务器维护,这一万人也不会因为你停了服务器就有多大的损失,那一亿人呢?你的服务器集群敢断电吗?敢让网站挂掉进行网站维护吗?
所以既然要让网站每时每刻不断运行,就首先要做到持续集成,持续部署,对应用进行完善的版本控制,为了降低系统bug风险要进行完善的发布前测试,而测试又分单元测试和集成测试,缺一不可。为了防止某个地区的服务器因为突发事故,比如地震,火灾,大面积停电等事故发生宕机甚至损毁,我们需要进行服务器的异地容灾,那么另一个地区马上就能无缝根据原有服务器的中断镜像进行服务重建,做到服务端这边“山崩海啸”,用户端那边还能一如既往的从容淡定,感觉什么事都没发生一样。
所以,扯了这么多,我用一句话总结编程的”工程性难点”就是,你如何在这错综复杂的耦合中,在复杂性不断增加的过程中,如何让软件有序,规范地”进化“,而不是让其肆意疯长,最后成为一坨无人能懂,无人敢碰的”屎山“。
算法上的难明天再来答。
算法的难主要集中在两点, 一种是算法的构思和提出, 一种是提出算法之后, 用code实现出来。
个人认为算法的构思和提出最为困难,因为这部分经常要求我们将我们眼中“显然”的东西,转换成计算机语言。
比如我们现在要实现一个算法,这个算法能够识别一张图片,判断图片中是否有人脸,对于人类来讲,这是不经思索的,一眼就能看出来的,但是问题是,你自己也不知道你自己是怎么看出来的,这个判断过程,其实我们的大脑内部发生了很复杂的化学反应,但是我们却说不清,我们到底是怎么判断的,还比如判断人脸的情绪等等。
但有人说,这说明计算机比人笨,事实上完全不是这样,计算机从来就不比人笨,事实上比起人类能做到的事计算机做不到,计算机能做到人类做不到的事反而更多。
计算机的特点就是容错率低,但是可预测性强,确定的代码和输入就能得到确定的结果和输出。
人类的特点是容错率高,但是可预测性差,对一个东西的执行结果经常受情绪,身体状况,心态等的影响,结果常常是不确定的。
所以其实,一个系统的”容错率“和”可预测性”是个永远不可调和的矛盾,一个编程语言如果具有一定的容错率,看起来好像编程更为容易,实际上反而是灾难,bug更难发现,问题更难复现,一个运行正常的系统很有可能有一天脑子一抽输出一个错误结果, 这就是为什么几乎所有语言都有异常抛出机制, 就是为了降低容错率。
所以我们要注意一点就是,编程困难,并不是因为计算机不够先进,不够智能,而是我们为了“可预测性”,心甘情愿地接受了这种极低的“容错率”,这直接导致你写程序,少打一个分号,编译错误,打错一个变量名,编译错误,数组越界,编译错误。
容错性这么低,你还指望它能接受人类这种模糊的自然语言?当然不可能了,所以它一定有自己的,语义清晰的语言。
一个语言一旦语义清晰了,语言灰度底了,它一定是逻辑性很强的,或者说,我们其实是用逻辑写代码,而不是用“感觉”或是“情感”写代码,这和我们人类理解世界的方式本来就是有区别的。
人类虽然有逻辑思维的能力,但是逻辑思维从来就不是人脑的强项,人脑的强项其实是整体感知,和一些“系统预设”的功能,比如你眼睛睁开了,投入你视网膜的光就会自动的转换成图像信息被你感知,这个过程你调用了任何逻辑思维了吗?你几乎什么感觉都没有就完成了一个极其复杂的过程。
所以我们的大脑绝大多数复杂的进程,或者说运行过程,都不能被我们逻辑性地去感知,比如你听到一首歌,这首歌给你一种很舒缓的感觉,你说你听着这首歌精品佛进入了一片天灵之地,但是这个过程,请问你进行了任何逻辑思维没有?
你就是感觉了一下而已,但是我们想让机器去做这样的“感知”,因为计算机体系的极低容错性,我们必须用我们的逻辑思维搞明白,这首歌,究竟是因为什么,它有什么样的特质,才导致了它给你这样的舒缓感觉,这样你才可能把这个过程转换成计算机语言输入到计算机中,让计算机去判断这首歌是“舒缓的“还是”狂野的“。
所以我总结一下编程在算法上的难,就是:
人类这种容错率高,可预测性差的生命,非要逼着自己去和一个容错率低的,可预测性强的这样一种”硅基生命“交流,不得不逼着自己用逻辑性很强的语言去和他交流, 在这个过程中我们不得不打破我们原有的感觉和感知, 对其进行逻辑解构, 这样才能让跨物种交流得以实现.
看到这里,你一明白了,要想让两种不同的生物更好的交流,要不就是让人类变得更像计算机,要不就是让计算机变得更像人。
你想一下siri,cortana这种语音助手,它是不是具有一定的不可预测性?你和它说一句话,你知道他要回复你什么吗?不知道,但也正因为如此,我们让计算机变得更像人类,从而让人类这一端,可以更轻松地和计算机交流,这其实就是人工智能。
一个AI的算法模型种,往往要引入大量的参数,然后不断地输入样本,根据预测值和真值是否匹配而动态地改进这些参数,这样一个系统,容错率是低了,可预测性呢?确定的AI算法模型能得到确定的预测结果吗?
所以与此同时,你也要注意。
容错率低的,重要的事不要交给siri去做,因为它和人一样,不可预测。
>欢迎大家参加我的Live, 本次Live将与大家一同探讨编程学习之最优方案
学习编程的正确姿势说个真实的案例。
我上学期做计算机网络课程设计,用Java,写一个QQ的主要功能。我是完全模精品QQ的,实现了私聊公聊加好友,传文件的功能。用了2个月,当然是断断续续在做,因为还有其他课程。
现在回头看一看工程,代码量不大,也涉及不到高深的算法,但是还用了很长时间,为什么?
因为需要用到Java swing,许多界面需要去学习,这玩意老师又不交。还有一些细节问题,比如如何在关闭聊天界面后,再打开该界面,之前的聊天记录还在?这些东西占据了我开发的绝大部分时间,实际的核心功能实现起来反而比较容易。
再说刚刚做完的一个iOS大作业,不好意思的说,没做完,只实现了部分功能。服务器用vapor,我不会用,因为常用navicat mysql。客户端就是swift去写,同样的,功能很简单,也就是数据库增删查改,但是比如swift的界面下拉列表怎么处理?要知道如http://asp.net平台都是封装好的dropdownlist,xcode可没有这些东西,都需要用代码去写。同学拖界面,segue的坑被踩了,一天调不出来,我1分钟就搞定了。不是说我比同学强,而是这个坑我以前踩过,理解了它的原理,故而解决起来容易。
还有iOS语言的坑,比如字符串startwith方法和hasprefix方法有啥不一样?我用后者就可以得到想要的结果,用前者就不行。
看看上面两个案例,都是我最近的真实情况。实际上,普通的编程并不难,就是经验而已。入门是艰难的,因为你需要了解语言特性,转换计算机的思维方式。但是一旦你知道某个功能应该怎么写代码,就不难了。但是往往这个代码需要你平时的积累。
剩下的比如算法的难题,工程的难题,我认为大部分也是经验的问题。只要别入swift这么年轻的语言的坑,像Java,c++,解决方案有很多。面试鹅厂,我问开发的时候需要自己写的代码很多么,面试官说其实大部分库都是现成写好的。
所以说,编程实际上不很难,写过一个工程,其他相似的工程就很快了。但是由于学习的时候有许多方面涉及不到,而开发的时候这些又是基础,所以现学现卖,就比较难了。
编程真正难在人脑和电脑这两种完全异构、不同原理的“运行设备”之间的差异。
感性的人脑和完全理性的电脑之间,唯一共同的语言就是编程语言。人类在编程的时候无法完全保持理性状态。
There are in fact two target platforms for all code: the runtime hardware, and the human cerebral cortex.
首先我不和你扯什么高内聚低耦合面向对象设计模型这堆没用的,一来新手看不懂老手不爱看,这些东西和喊口号差不多,有点像世上无难事只要肯攀登一样是一句道理谁都懂然而并没有什么卵用的废话,实际项目我还要写文档说这个运用了xx思想xx模型传达了xx精神不成?
不过编程的难点现在不在以后也不在语言本身,就像英语汉语日语一样,你文章写的好和你对这门语言了解到什么程度关系并不是很大,厨师做菜好不好吃也不是因为他有没有一把好的菜刀。
你有什么有单片机或开源硬件做的有意思的作品吗?再比如这个前年写的单片机网络音乐播放器,它是c语言写的,然而仅仅是因为c语言会用就能写出来?你得先从数电模电开始,通过翻芯片文档了解单片机和解码芯片性能,通过了解通讯协议来建立mcu和外设的数据交互,通过了解tcpip协议对网络数据传输做优化,恐怕还得学学电烙铁怎么用,不然有的地方还得上上焊接。
DBinary:PainterEngine打造独立游戏写游戏就更有意思了,你不仅得了解多种图形上的物理上的逻辑上的数据结构上的编译器上的虚拟机上的还得学画画,这些和c语言有啥多大关系,c语言只是向计算机阐述我想怎么做你应该做什么,而具体这个东西怎么做还不是得由你自己把握。
然而即便编程语言本身现在不是以后也不是编程的关键和难点,仍然有一堆人看了不到两小时的书那边喊难,这类人你看看是不是可以在下图对号入座
对于这个我们也很烦,我们说别问了百度更快,他们还振振有词说你不回答就算了凭什么不让我问你不说有人会说,对此我表示
难的根本不是问题本身而是处理问题的人本身就是个难点,这态度你说咋学
学习的东西无非是
编程很难那你告诉我除了吃饭睡觉打游戏学东西哪个不难
1 考虑问题不周全,这一点就是需要天份和努力双子座。程序员是一个严谨的职业,不周全的代码就会有漏洞,这种思维方式,在什么时候有过专业的训练?并没有。
2 忽视了扩展性,很多人只能尽全力实现自己当前的需求,很少有余力能考虑到未来的变更。然而写代码是一个持续的事情,总会为自己当初的错误买单。人生如此,写代码更是如此,不是么?
3 缺少测试的动力,多数人都沉浸于正确的路怎么走,在大多数人眼里,都应该按照正确的路去走,可是程序员研发出来的系统要求必须考虑什么是不允许做的,像是一个虚拟世界的规则制定者。可是谁会反复站起来看自己手里的工艺品是否完美无瑕呢?你只是程序员而不是艺术家呀。
4 对底层知识要求很高,大多数程序员无法变的更厉害,就是接触底层知识太少,一旦遇到黑盒子,立刻懵逼。你让他把西红柿放冰箱还好,你告诉他冰箱在2019年7月3号下午4点13分~15分出现温度升高2℃,他怎么解决呢。
5 忽视文档的同步,很多人都认为自己写的代码就是属于自己的,完全不需要交流和沟通,更不需要花点时间维护一下。这好像是,我煮了个泡面,你要我写清楚煮泡面的设计规划方案?
6 没有复用性。抽象和分层是穿透表象,分析核心的重要思维方式,不把每一个细节掰开揉碎,很难组装起来。大多人宁愿重复做无意义的事情,抱怨整天写业务代码,从来不愿意思考用什么方式能够让自己的工作更高效简单。毕竟,抱怨是容易的。
7 缺少凭空想象力,有象棋,围棋经验的人可能会清楚,多数要在自己脑袋里去推演场景。编程也是,在设计之初,对着空气要构造出来未来的样子。在上线之后,对着日志要复原出来当时的样子,是不是比警察破案还要酷?
8 缺少主动学习方法能力,大部分人仍然停留在别人教什么我学什么,不教我就应该不会,不会就别怪我的阶段。我年纪大了,我英语不好,我零基础,我没时间,我们公司用不到这么高深的框架,没有技术大牛愿意带我,公司太慢不给我时间成长。做为dws学习法的倡导者,做为主动学习的实践者,慢慢理解,对他们来说,编程实在是太难了!
我们自小都只学会知识,通过知识去间接训练自己的习惯和思维模式,然而到了工作中慢慢发现,错别字不要有,命名要统一,分解任务要明确,反馈进度要及时,做事有先明确预期再验收,是这样么?在游戏里开团才学会团队协作,在篮球场上去联系组织能力,在棋牌中模拟场景,在谈对象的时候练习包容和尊重。
这些都是编程中少不了的啊,其实不是编程难,是编程是一个照妖镜,照出来每一个人被隐藏起来的短板。
我觉得我能吐槽一年~也一直想办法怎么做能提升大家各种编程能力,而不是仅仅教授语法框架这些知识,欢迎关注IT修真院的知乎专栏,也许哪天我就想到了呢?
面试