编程究竟难在哪?

论坛 期权论坛 study     
匿名的用户   2019-6-10 01:17   6919   5
例如C语言,C++,Java,好多程序语言就算学很久也可能不会,为什么这么难?有什么好方法么?
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心的回应  16级独孤 | 2019-6-10 01:17:59 发帖IP地址来自
编程一点都不难;它只是和你十几年来在学校受的教育格格不入而已。


自小你受到的教育,总是:
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代替人工作。


如果连“手电筒的原理”你都理解不了、如果连“遥控小车”这样简单的发明你都做不到“信手拈来”……那么,他人从液体分层原理借来的冒泡算法、从猜测的人脑工作原理偷来的神经网络,你又怎么可能理解?
它要求的,是“从三百五百甚至成千上万个知识点中挑选出最合适的那几个、然后用它们解决你所面对的问题”!


编程真的不难;但你从未受过解决问题的训练。
而编程,恰恰就是最最纯粹的、以精确无歧义的方式表达问题解决方案的一种工作。


不。
你甚至不知道“学习编程”就是学习“如何用电脑解决问题”,反倒学编程语言本身去了……


这种学法,怎么可能不难?
3#
热心的回应  16级独孤 | 2019-6-10 01:18:00 发帖IP地址来自
@invalid s 大佬说了关键点,这里算是做一点补充吧
编程难么?对于有些人来说确实挺难的,我在大学里见过许许多多靠背代码过程序语言专业课和二级C的同学,其中不乏优秀的同学,比C语言难100倍的模拟电子技术、高频电子技术、通信原理他们能考很高分,但C语言就费老牛劲。我考二级的时候带了一支笔悠哉悠哉的就过去了,看到走廊上一群拿着辅导书玩命翻的人,很是迷惑,有那么难吗……
后来我也算是略微想明白了一点,这是“学以致考”和“学以致用”的区别
编程学习跟应试教育是完全互斥的学习方式,应试教育那一套不用管理解,只管背概念-背题型-做题拿分的流程在这里是玩不转的
在应试教育模式下,你可以不懂期望、方差等一系列概念是如何被发明出来的,可以不懂微分方程有什么用,可以不懂戴维南定理、H参数等效电路拿来干啥,不理解,不影响你套题型套公式求出正确的解,拿到分。
但是对于编程来说,“不理解概念”的负面反馈是及其迅速和强烈的。因为编程没有“题型”和“公式”可以把你解决问题的过程简化成填空,编程提出的问题相对来说是很宽泛的,需要你根据脑子里的逻辑推断,利用所学编程语言的各项功能组织成代码去解决问题。当你不理解概念的来由和用途的时候,你根本就想不到用它,也解决不了问题。
比如你不理解指针,那么涉及结构体、链表、文件操作等知识的内容你统统都会难以理解,更别说编写程序了,面对一个空空的main函数,你都不知道要不要用指针,背了*p是指针,&p是取地址,背几行操作指针的代码,又有什么用呢。
学习编程语言就像你学习卷尺锤子扳手怎么用一样,只是学习工具使用。任何一道试题和现实中的需求,都是在考你用工具解决问题的能力,而不是你对工具本身的了解。每一行代码都是人如何使用多种工具达成一个目的逻辑过程,只要你有一行代码,甚至于一个关键字、符号不理解,你写出的程序就可能出错,而计算机是个很简单的东西,不对,就不过,不会给你步骤分。
理解每一个概念的来由、定义和用途,是学习编程语言的最基本的要求。
我自己在大学里辅导过不少C语言老大难的同学过二级,我从来不让他们刷题,而让他们拿看不懂的程序给我,我一行一行的给他们讲代码为什么这样写,查找他们知识点的缺陷,帮助他们理解,最后他们考过二级也都是凭借着用自己理解的概念写了能写出来的程序,而不是蒙到考题把背好的程序从脑子里贴上去。
另外一个重要的点就是要“用”,这点包括很多已经工作的同学都在犯,喊着“我要学C++/Java/XXX”然后抱着一本大砖头开始啃,啃了两章就没下文了,为什么会有这种现象,学了,能懂,但不知道怎么用,不断学,却练的少,最后在迷茫中打出GG,编程语言是个蛮复杂的工具,不要指望一蹴而就,当你刚掌握还不熟练的时候,不用很快就会生疏。
为什么很多人推荐一边看开源项目一边做练手项目来学习,就是为了填充从“学完工具怎么用”到“用工具解决问题”之间的鸿沟。
题主说C语言难学,我不知道题主是不是还在上大学,据我身边的情况来看,国内大部分大学的C语言教学质量是很堪忧的,包括部分985。以至于身边很多同学学完C语言课程之后,居然不知道#include是什么意思,不知道头文件,没听说过C标准库,不知道函数指针,不会多文件编程,课程设计千把行代码就一个main.cpp(是的,.cpp不是.c)。在这种环境下指望按着学校安排的课程大纲学好C语言是不现实的。
如果你C语言的基本知识都很成问题,那么请丢下编著的教材,可以去找国外教材但是不推荐大砖头,或者在网上找公开课,把学习重心放到理解概念上,我个人推荐 C语言入门教程-C语言中文网
如果你是在拿C进阶实践上产生了疑惑,那我推荐一本书 Unix/Linux编程实践教程 。按着这本书上的章节去一个一个实现Linux/Unix上的各种系统命令,看看“C语言除了考试还用来干嘛”,“正儿八经的C语言程序怎么写”。
C++和Java相比于C,理解面向对象程序设计是一道坎,这一道坎,需要你用代码堆过去,空想是没有办法理解的,做题也没有办法理解,面向对象是为了应对有规模的工程如何组织代码而提出的概念,想要理解,也应该去看看上规模的工程是怎么用的,推荐自己一边学一边做点小东西,比如用Qt做桌面应用,拿Java写点Android Demo等。
4#
热心的回应  16级独孤 | 2019-6-10 01:18:01 发帖IP地址来自
我觉得难的是写文档,做ppt,吹牛逼。
5#
热心的回应  16级独孤 | 2019-6-10 01:18:02 发帖IP地址来自
第一等级的编程难,和学英语是一样的难度:记不住单词/命令/库/best practice(这个中文应该叫什么?)。
大部分爱好者和手写代码一万行以下的,卡在这个阶段。这个没办法的,不可能有捷径解决,只有去练。相信21天学会JAVA的,和相信社区live5小时精通雅思单词的一样蠢。
第二等级的编程难在生态,C++还好点。现在连JS都讲究生态,别说微软系和JAVA系了,从前到后一大堆,以前写JS开个notpad就可以,现在装个nodejs就劝退一堆人。编程的生态环境现在已经十分复杂了,这也造成了隔(语言)行如隔山的状况。
这一级主要是初级人员往中高级人员进步遇到的槛,解决方案是自己投钱投经历,把本行主要的生态环境在自己家里搭建起来,摸索摸索。
第三等级的编程难在思维。很多人语句熟悉了,生态熟悉了,脑子还是人脑。拿到一个需求,就在脑子里把中文的英文的需求,翻译成JAVA的,C的,JS的。这是阻止大约SDE2/P6这个层次往架构去的主要原因。计算机编程的一大特点就在于对自然世界的抽象,提炼和优化,而单单平等的翻译,是做不到一个好的人员的。
最后的一个编程难度在TMD和蠢货沟通上。脱离了单纯开发工程师到了技术专家的角色,你面对的是无穷无尽的蠢货的问题。“为什么再加点内存不会更快?”“为什么加一倍人开发时间不能缩短一倍?”“为什么你们的软件不能侦测到服务器死机了重启服务器?”TMD我这是JAVA好吗!重启服务器你去找Oracle ME啊,蠢货!

6#
热心的回应  16级独孤 | 2019-6-10 01:18:03 发帖IP地址来自
其实,做任何事情都很难,无论是编程、做营销活动、做商业计划、做融资、做一个手机的工业设计、写可以大量引流的公众号文章……
只不过编程难的比较有性格
你以为你在学习编程语言,其实你在通过编程在操控一系列资源做工作(CPU、内存、磁盘、网络、显示器、浏览器……)。编程语言是渠道,本质上你需要更多的理解真正干活的那些东西的工作原理。编程语言本身不依靠其他依赖,是不太可能解决实际问题的。没有CPU、显示器连hello  world都输出不出来。也许编程语言的学习会花掉一些时间,但实际上需要花更多时间放在“整个机制是如何工作”这个事情上。为此,要学习的东西是呈倍数增长。
编程往往会结合业务(人类思维)和技术(机器思维)。这两类思维的差异非常明显。著名的“让程序员:去买6个苹果回来,如果看见西瓜就买一个“就是这种问题。开发者要用人类思维去理解PM的要求,同时又要根据严谨的逻辑去将方案转化为可以实现的流程图、状态机。这还不包括抽象、因为成本的考虑做成取舍之类的考虑。有人说,我做纯技术(比如数据库、中间件)就不用考虑业务了。其实那时候的技术需求就是业务,比方说想让数据表可以存储json类型,中间件可以跨不同平台工作……
编程大部分时候是一种群体工作,需要密切合作。前端开发、后端开发、数据开发、测试、PM、设计师等一群人集体完成一件事情。一个人通杀一切的时代早已经结束了。而一群人一起工作就要协作,需要保证彼此理解一致,就需要流程、文档、协同工具等。做其他行业,比如营销策划也需要协作,不过编程里的协作因为涉及到到的信息量和精确性都很高,必须采用更复杂的工具和流程,而非几个人找个会议室开个会聊下基本上就可以解决问题。
当然,还有些领域的群体协作比编程复杂的多的多,比方说造飞机,发车登月飞船
编程因为解决问题的需要,会用不同的方式看待这个世界,并且做独特的抽象。这些抽象是大量实践慢慢积累的结果。比如“线程”,“文件”,”锁“,  “Object”,“Actor”,“Function”、“Future”、 “Promise“, ”Generator“,某种“模式”……,这些概念的有的有现实实体的对应关系,但是要进一步理解实际的意思还要多花一番功夫;有的压根在真实世界里就找不到对应的关系,完全是人类智慧的产物。为了理解它们需要反复实践,找到这些东西的场景,反复琢磨才能慢慢领悟。这需要耗费大量的时间和精力。
也许有人发现自己在编程过程中没有/很少遇到上面的问题,觉得编程很简单。总是能够按照类似的方式一遍又一边的写代码来赚取收入。我很遗憾,这种叫做“流水线编程工人”,永无出头之日。毕竟对你简单,对别人也同样简单。门槛对所有可能的参与者是一样的。
如果真的想跳出来,真的以编程为事业,那么并没有什么捷径可走,下定决心去学习、思考,并在痛苦中努力成长,能够做其他大部分人都做不了的事情。这个方法也同样适用于任何职业。
相关问题:
大宽宽:金融IT需求过多并且复杂,团队敏捷开发并追求交付效率,导致技术负债过多,有没有什么解决方案?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:32080
帖子:6440
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP