qiyecha 发表于 2023-12-4 22:35:42

如何学习编程?

如何学习编程?

坏人 发表于 2023-12-4 22:35:53

最近有几个朋友私信问我如何学编程。我上知乎基本就是随便写点代码来着,这种误人子弟的问题我真的不敢乱说。也罢,找个问题随便谈谈吧,聊胜于无。千万不要当真。
我觉得SICP作为第一本编程书非常合适。SICP可以让我们从零开始建立起整个对于程序语言和程序语言如何被解释的粗浅认识。知道什么是数据,数据结构如何用一个小小的cons组织起来,什么是过程,过程可以接受过程做参数并且返回过程,还有和解释器息息相关的囿变量、自由变量、环境,等等这些重要的概念。
然后我们需要接触机器相关的知识了。我建议学汇编。8086汇编就行了(硬核的话,或许可以学PDP-6汇编)。注意一开始从最基础的move,add,lea开始。然后引入栈的push和pop指令,有了栈就可以很方便的复用过程了。栈一定要好好理解,这是过程在机器里面如何抽象的关键。然后引入call和ret两个语法糖。学会汇编写二叉树就够了。
因为用汇编写二叉树,一大堆dword,lea,肯定迷糊死了。这个时候可以上C语言了。看TCPL就行,简单了解C语法就够了。C语言有指针和int等基础类型,用C写一遍二叉树,明显能体会到类型的好处。另外,C是汇编语言的又一层抽象,这里可以结合SICP里的数据抽象和过程抽象好好理解,C到底是怎么抽象汇编的。
写过一些C之后,了解类型的好处了。这个时候可以看TAPL。结合SICP就知道scheme基本上就是λNB的少糖形式。TAPL也是SICP这种从零开始逐渐复杂的结构,非常适合萌新看。完全弄懂λ cube和subtype就够了。TAPL里面还有很多细节,萌新看的时候可以忽略。
到这,编程基本上就入门了。对机器底层感兴趣的去学体系结构;对数据结构和算法感兴趣的去打ACM;对PLT感兴趣的继续看ATTAPL,SF;对钱感兴趣的忍着自己对C++语法的恶心去学C++;对John McCarthy感兴趣的(?)去学ML,等等。安排的明明白白。

yanghandsome123 发表于 2023-12-4 22:36:06

谢几百个邀。这题确实很大,很难讲得面面俱到,我便暂且从我个人经验和角度出发,希望能够起到抛砖引玉的效果,给诸位一些小小的建议。
本文共计:4401字,预计阅读时间:7分钟
目录(可按需进行定位阅读)

[*]前言:明确编程的本质
[*]必要的辅助工具与技能
[*]明确学习的方向
[*]选择合适的学习方式与方法
[*]总结
0)前言:明确编程的本质

其实我们在小学时代解答应用题的时候,就已经逐步培养起将实际问题抽象建模、选择合适算法(例如加减乘除)进行求解的思维方式。当计算量巨大或者问题过于繁冗时,人工手算显然开始力不所能及,现代计算机便应运而生,自动化编程也成为了一种社会发展的必然趋势。
所以究起根本,编程即是将实际问题抽象为一种模型,再用一种高度逻辑化的语言,用特定的算法进行描述与实现。
1)必要的辅助工具与技能

学会使用git指令和github:
我大四时前往爱尔兰进行交流学习,教授ruby语言的老师专门用了整整一个学期,反复穿插地考察了我们git的掌握情况。刚接触的时候苦不堪言,常常一条错误的命令敲下去,写了三天的代码就能当场从爱尔兰回滚到中国。有好几次我都是在deadline前出了branch merge的错——
不如连夜客死他乡。
但当我逐渐掌握git指令并学会使用github后,我才意识到github是多么牛逼的存在。作为全球最大的同性交友平台,github的版本控制功能和代码托管功能十分完善。特别是在实际工作场景里,一个多人的大型项目如何规避冲突和高效配合将成为首要重点。
对于初学者,学会如何使用github将会提供了一个良好的开端。养成不同功能的模块开发写在不同的branch上的习惯,能够使你的项目逻辑清晰并易于修改。如果你把所有的代码全部放在一起,一旦你写了层层嵌套的塔型狗屎(这是你一定逃脱不了的命运……),无法连根撤回的bug堆将会直接击碎你还没开始就已结束的编程梦想。
所以如果你想要学习编程,那么请现在就打开一个新的tab页,输入https://github.com,注册属于你的交友账号。初学的小朋友们也不要过于担心。这玩意儿虽然看起来有些复杂,但是相信我,它比看起来更特么复杂……不过不要畏难,要知道这点困难在你今后的编程生涯里,毛都不算……
相关教程:
github官方教程:https://guides.github.com/activities/hello-world/;
个人博客:https://github.com/phodal/github;
菜鸟教程:http://www.runoob.com/git/git-tutorial.html;
选择一款合适的IDE:
挑选一款合适的IDE会使编程体验和效率大大提升。IDE即集成开发环境,是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和用户图形界面。不同的IDE可以适配不同的工作应用场景,例如:PHP:PhpStorm;web开发:WebStorm;Java:Eclipse,Intellij IDEA;C、C++:Visual Studio ,Xcode;扩展性强的通用IDE:Sublime 2,Emacs,Vim;
建议右上角关闭:word和txt文本编辑器
sublime 2最易上手,虽然它是收费软件,但却可无限期试用……可谓良心代表
sublime 2下载地址:http://www.sublimetext.com/2;
vim不建议新手使用,因为如果不明白操作指令,进入vim模式后你只能茫然地敲下若干随机字符串,然后关机以求解脱。。。
我曾偶然看过一部电视剧的片段,女主在一夜之间学会了Java,成功地编写并部署了一个大型项目,于第二天早上的凌晨五点钟,通过qq将代码以word文档形式发给了甲方……
我至今都记得那是宋体。14号。加粗。方法名还是斜体。
在此我恳求我的编剧朋友们,今后若是涉及到编程相关领域的剧情编写,下笔之前请务必来问问我……
2)明确学习的方向
计算机编程领域的分类众多纷杂,不同的划分标准下有不同的开发方向。例如:
按编程语言划分:JAVA,Python,C/C++, Javascript,Ruby,PHP,etc.;
按开发平台划分:Web,IOS,Android,etc.;
按岗位职责划分:前端,后端,运维,测试(黑白盒),数据分析,网络安全,etc.;
按生物种类划分:独一无二的 @玲珑邪僧,其他程序员。
对于之前没有任何编程相关经验的初学者,我的建议是不妨先学习前端相关语言(JS、HTML、CSS)。因为所谓前端开发,即致力于开发客户端上同用户最直接交互的界面,运行即见所得,初期基础项目环境部署相对简单,编译结果可视性强,相对于后端更容易获得最初阶段的满足感,并能获得可持续性发展的兴趣与坚持下去的动力。
例如闲来无事可以做一个简单的h5页面赠与好友:

http://picx.zhimg.com/v2-f0e4ab417d74cceb8f2a744093a0e3dd_r.jpg?source=1def8aca
点击切换效果:

http://picx.zhimg.com/v2-344b758d4d6479dc9102fdbef88a15df_r.jpg?source=1def8aca
如若不出意外,你便可以顺利收获王丹的高度称赞和一份破裂的昔日友情。
随着前后端的逐步分离,MVC模式里的View和Controller逐渐都归纳于前端领域范畴,如何搭建一个易于维护、性能高效的前端代码框架是一个十分需要探索与钻研的事情,各类前端框架例如Angular、React、Vue也因此应运而生(但切记不可只依赖于框架而不打好原生js的基础)。另外务必打好结实的css基础,因为当你的产品经理进行哪怕一点点的需求变动,你就会深刻体会到什么叫牵一发而动全身。
当然,你若想从事后端开发也未尝不可,只是环境部署相对较为复杂,所需的知识基础也比较晦涩生僻,较易挫伤初学者的信心。毕竟每个想当程序员的初学者心里都住有一个上帝,希望的是随手一指便有光,而不是大手一挥一片黑,再动两下还塌方……
3)选择合适的学习方式与方法


[*]若你是相关专业的在校学生,请务必:
1.学好所有相关的专业课程,无论它多么枯燥乏味。
你若不学计算机组成原理,你便不知道一个int型数据类型占4个字节是何物理意义,更不会透彻理解变量声明和变量定义的区别;你若不学数据结构,你便不知究竟该如何用最优的算法进行最优的深度优化。基础是重中之重,打好基础在工作后能让你甩开大部分同行一条街。
2.不要质疑老师让你阅读代码、抄写代码的意义。
我曾经对这样的学习方式一度十分嗤之以鼻,自负地认为简直不可理喻,但事实证明,你老师终归是你老师,这种做法一定有其存在的合理性。你能看懂的和你能写下的绝非是同种东西,一旦落笔便能知道,你很可能连静态局部变量和动态局部变量都没有彻底搞清。
例如:

int fun(int n){
static int f=1;
f=f*n;
return f;
}
void main(){
int i;
for(i=1;i<=10;i++)
printf("fun(%d)=%d\n",i,fun(i));
}
static会直接导致输出结果是阶乘还是单纯的乘法算数。而如果你不自己敲一遍,你很可能会忽略这个关键词究竟存在与否。
总而言之,代码在任何时候都不要复制粘贴,请务必自己一点一点进行手写。

[*]若你是某一特定领域内的初学者:
合理充分地利用网络资源,多维度多渠道结合学习,切忌初始便买上几本厚厚的砖头书,进行毫无针对性的泛读而不进行任何实操练习。
我个人比较喜欢查阅英文的教材和视频资料,表述更为简洁,在编程领域里其实也更为语义化。有关MOOC在线的争议向来较大,不过我个人而言,我是会首选英文MOOC平台进行较为系统学习。面对一个新的领域,明晰的总体脉络走向和精准的切入点,能比单纯的自我学习大幅提高效率。
各类国际化引进MOOC平台中相对成熟著名的有:Udacity,edX, coursera等。不过单就计算机领域的MOOC教育来说,个人比较偏向选择Udacity。由于我最近准备着手转向机器学习正在学习python,故暂且以python入门的预览部分https://cn.udacity.com/course/intro-to-python-nanodegree-foundation--nd000-cn-python(但似乎先需注册),可看出它的汉化工作较为完善。在初期,若是本身就已经看不懂代码了还特么听不懂人话,这足以让你写出一本python从入门到放弃…… 第二点也是最重要的一点——存在code review这个环节——在此我要敲黑板强调:
请各位务必珍惜有人在你初期阶段便愿意帮你进行一对一的code review。
在初步学习阶段,其实有两件事情至关重要:
1.独立开发一个完整的项目;
2.有专业人员给予代码的审核指导(code review)。
我之前就职的公司,每天早上10点进行standup是雷打不动的规矩,我被我的reviewer当众吊打也成为特色表演节目之一……虽然被揪头发的感觉痛苦,但是各位务必要记住,一定要珍惜别人给你的review意见,也要多review别人的代码
——毕竟自己的代码自己怎么看都牛逼,只有互相揭穿对方的傻逼才能共同进步……
零基础初学者可以预览相关入门https://cn.udacity.com/course/intro-to-programming-nanodegree--nd000-cn-basic(似乎也需先注册),可以体会我所说的以前端为首要切入点、python作为后期配合的架构,与之前在第二章推荐的大致相同,较为合理。
另外,code review也是github的重要存在意义之一。团队项目里提交一个pull request一般来讲是绝不允许自己合并到develop或master主支上的,需要有一个或一个以上的reviewer进行审批后才能确认merge。所以再重申一遍:一定要学会使用github。
此外较为知名的文本教程网站有:
w3school 在线教程,菜鸟教程;
w3school有思维导图(这点我认为很好),课程内容也较菜鸟更多,但是我之前更偏向用菜鸟,因为它的用户界面让我觉得比较简洁轻松,w3school相对显得有些庄严……(w3school:?
较为知名的刷题网站有:
lintcode:http://www.lintcode.com/zh-cn/,
codepad:http://codepad.org/
当有一定的学习经验后,善用在线练习网站进行巩固便变得十分重要。所谓编程,重点在编。相信我,你所能犯的奇葩错误种类绝对超出你对自己的认知……如果不进行实操练习,你永远都不会知道哪个知识点你没有掌握周全。
较为知名的技术博客有:
vczh轮子哥:λ-calculus(C++方向)
赵劼:首页 - 老赵点滴 - 追求编程之美(C++方向)
@路人甲 学习编程(Python、数据挖掘方向)
廖雪峰老师:https://www.liaoxuefeng.com(前端、python方向)
当你遇到一个问题时切莫灰心慌张,你的坑肯定有前人帮你踩过,善于利用技术大牛的博客,会使你事半功倍。
4)总结

勤奋钻研,方得始终;
抛砖引玉,与君共勉;
玲珑邪僧,宇宙最强;
综上所述,写得很累……

————————

大家好~

我新开通了公众号:万物情史

欢迎并诚挚感谢大家关注

Friendcome 发表于 2023-12-4 22:36:43

你是如何开始学习的呢?
是看书?还是看看视频?还是报班?还是拿着C语言书猛看?
以上全错
我讲下我是如何失败的
我有幸考入了某985高校的计算机系,但很不幸的是导师基本是放羊状态,基本全靠自己撸,俺当时还是非常爱学习的,热血青年,兴趣满满,于是就去图书馆里找了很多书,什么高大上看什么,比如xx底层实践、xx天学会Java、xx机器学习,像一个无头苍蝇一样。这是犯的一个重大的错误,没有方向和目标,没人引导。
看书是非常枯燥的,我记得当时非常郁闷,不想荒废大好时光,但书看过来看过去实在是看不懂(我基础还不错,研究生入学考试计算机接近满分),这是犯了第二个错误。
当时学习环境也是非常不好,实验室舍友成天打LOL,因为实在是无事可做,从早到晚。我一个人学习又那么幸苦,又没有成效,于是一段时间后就放弃掉了。
主要有三个错误,方向不对,方法不对,环境不对。
一 确定方向
方向最重要,一步空,万劫不复。不说编程了,就说目前听父母话做公务员的,进国企的,又有几个活的开心的?回到编程,当年做C#的、做底层嵌入式的,又有几个发展的比较好的呢?我见到当年做C# framework的40岁转行学其它语言的........一步踏错,满盘皆输。不是说它不好,主要是风险大,容错性低,当然,如果你是特别爱好,或者说是有明确的业务方向,当然也是极好的,比如说你们导师就是嵌入式的专家,而且确实对黑科技,机器人啥的非常感兴趣,那嵌入式对你来说就是一个巨大的优势。但如果你不了解行业,而只是听别人说学Oracle好、学Cisco好,学Java好,但其实你根本不知道之后做什么,不了解真实情况,那岂不是把自己的脑袋悬在别人的裤腰上?
没有什么语言最好,但有几个需要慎重考虑的:
1 不建议用C或C++语言入门
该语言极难,用的少,用它入门除了挑战人生极限实在不知道有其它好处,建议从简单的入手:Python和Java比较好,简单,面向对象,使用面广。JavaScript语言特性过于灵活,Php使用面比较狭窄,IOS的使用面也比较狭窄,而且和主流语言有所差别。
2 不建议学习Oracle、Cisco和C#系列
使用的公司少,就业面狭窄。Oracle主要金融、银行在用,属于比较“古老”的技术;Cisco是路由器技术,你如果希望做苦逼的运维,三班倒的话不妨尝试下:)但运维实际上已经不是程序员了; C#运行的Window服务器环境貌似只占了5%,这些语言并不是说不行,而是使用面狭窄
3 不建议贪图编程收入高而转行
一般人高估了收益,而低估了困难程度。计算机是有一定门槛的,你如果不是怀着极大的兴趣参与,实际上你很可能并不适合这个行业,那么5-8年后呢?10年后呢?华为大规模开除35岁码农,年纪大了,转行无望,空余愤恨。如果你不了解操作系统,不知道数据结构,我想很难在这个行业做的很深吧。
这也是培训机构被人诟病的原因,不培养能力,夸大未来期望。如果没有all in的考虑就不要考虑转行了,每个行业顶尖的也只有10%,无论哪个行业,能做到10%你就nb了,与其转行还不如首先搞清楚什么才是最适合自己的。
如果你想选一个方向,可以简要参考下入下介绍:
我们可以把整个互联网开发大体分为Web前端、移动端、后端开发,此外还有嵌入式、机器学习等等....
目前最热的是Web前端开发,前端的火爆来源于移动端的爆发性增长、Nodjs后端框架的流行、微信小程序的出现(后面可能还又一波),具体历史可参考我的这一篇:零基础开始学 Web 前端开发,有什么建议吗? 这里不再重复。但培训机构复制了大量“前端仔”,所以对前端的要求也在逐步提高,但一般来说前端工程师和后端工程师的比例是3:1,所以市场上需求量还是比较大的,是个不错的切入口。如果刚兴趣的可以加前端纯互助学习群:370423482,我也不定时回答下问题。
服务器后端开发的语言比较多,用的比较多的有Java、PHP、Python、Ruby、C#。Java是使用的最广的语言,虽然比较古老,而且语法一点也不简洁,但由于组件众多,在大规模复杂系统中得到广泛使用,比如电商等领域,Taobao,JD等公司。而且在ERP系统,管理系统中也用的比较多。此外Android也是基于Java,所以,Java可以说是使用面最广的语言。
Python这门语言相对Java就简洁的多,由于出现的时间比较晚,国内在服务器开发领域还是比较少,但它大规模应用于数据科学领域,比如机器学习、数据统计等等。由于其简单、设计良好、面向对象,所以用于入门是再好不过的。
“PHP是世界上最好的语言”,网站开发中得到大规模使用。
C++能做什么呢?貌似什么都能做,又什么都不能做... 但学习C++对了解计算机体系结构还是非常有作用的,其应用范围包括操作系统、驱动开发、黑客技术、反编译软件破解、外挂开发等等,包括Nodjs、Java虚拟机、数据库的底层代码都是用C++来完成,所以如果你立志做一名极客,可能C++还是必须掌握的。但是其比较难,不像其它语言撸几天就能撸个网站跑起来,C++从入门到应用实在是一件挺困难的事。
2016 Github 流行语言排行榜:

http://picx.zhimg.com/v2-0dbca0127c8601bbe668571c0dcfc642_r.jpg?source=1def8aca

选好了方向后就可以开始撸项目了
二 编程除了做项目,没有第二种学习方法
套用《乌合之众》里的一句话,其作者是法国人,特别鄙视法国教育制度,认为和中国越来越像了,于是在这本著名社会学的书籍中吐槽
"向人灌输大量肤浅的知识,不出差错的背诵大量的教科书,是绝对不可能提高人的智力水平的。
在我们的生活中,能够帮助我们走向成功的条件是判断力、是经验、开拓精神!而这些书本当中是无法习得的。
观念只有在自然而正常的环境中才能形成,而书本的知识本质上是反人类的 -与人类的思维习惯不同。
因此,我们需要年轻人每天从工厂、矿山、法庭、书房、建筑工地和医院中获得大量的感官印象;他得亲眼看到各种工具、材料和操作;他得与顾客、工作者和劳动者在一起,不管他们是不是干的好,不管他们是赚还是赔。
只有这样,才能了解那些从眼睛、耳朵、双手甚至味觉中得到的各种细节,才能在心中逐渐形成观念,并且会组合、简化形成新的概念。
而我们年轻人,却恰恰在最能出成果的年纪,被剥夺了所有这些宝贵的接触,七八年时间一直被关在学校里,切断了一切亲身体验的机会,对世间的事物缺乏准确的认识。
而后成家立业,落入生活的俗套,把自己封闭在狭隘的职业中,这就是狭隘而平庸的生活。"
一句话
“填鸭教育培养SB”
因此,学校里的教育基本都是脱节的,已经没法培养出真正可用的人才了,基本只有靠自己。你如果想学习编程,除了项目外,没有其它方法,你可以找到一个学习路线图,然后开始照着路线图走,但这个路线图一定要是由一个个项目节点组成的。我写的一篇《web前端学习路线》
https://www.zhihu.com/question/30180100/answer/156399333里面给出了阶段性的项目,大家可以参考一二
学必须通过一行行代码,亲自痛苦的解决一个个bug,这样才能形成有效的反馈。单单的看书、看视频是没有任何鸟用的。
其它语言的学习也需要做项目,就像游泳一样,你从不下水怎么学的会呢?

三 我什么都不会,怎么让着手做项目呢?
学习里的教育向来都不是项目驱动制的,而是填鸭式的,东西都是老师讲了你才会,向来缺乏主动探索能力。但很不幸的是,好奇心和探索精神才是成功的主要因素。那如何培养这种能力呢?
举个例子,我们拿前端学习为例:
上策:找人带
师徒制是最好的制度,为什么在学校是一条虫,进公司了就立马nb,因为在公司有真正懂行的人给你指明方向,而学校老师基本没这个能力,如果你周围有懂得人,或是肯带你的人,别纠结有没有钱拿,先干起来再说吧。
中策:找环境
北大、清华为啥nb,facebook为啥是在哈佛起步?因为里面人牛,牛人相互比较,相互促进,扎克伯格说“我们整天在宿舍讨论网络会给社会、政治带来哪些变化....”我们大学讨论什么呢?王者荣耀有几杀?还是哪个妹子漂不漂亮?有可能的话,尽量找个能奋发向上的环境,但是这个环境真难找,学校里充斥着各种玩咖,如果物理环境找不到就找虚拟环境吧,比如我们建了有编程纯自助学习群:370423482,欢迎大家来交友、玩耍。
下策:自学
自学难度太大,普通人很难坚持下来,当然,比尔盖兹之流请略过
项目在哪儿?
网上那么多免费视频,最简单的法子,跟着视频敲。如果自学能力强的,跟着文档敲
以具体项目为阶段目标
很多课程都是以知识点为目标,比如js按照知识点分为函数、对象啥的,那么把这些割裂开来进行讲解,这样即使听懂了每个知识点,但也不会使用,所以,应该以项目为目标,比如web前端开发进行难度递增的划分:静态网站制作、动态网站制作、复杂表单制作、前后台交互制作...等等
目前的免费视频不是有很多么,可以照着视频上的项目敲就好了,抄完之后再去做新的项目。
寻找驱动力
很多人学习坚持不下来,因为学习对大脑是一个“痛苦”的过程,远不如游戏,把妹,来的有趣,而编程本身是比较有难度的,比如环境不会配,代码总是有问题,等等,稍有挫折就可能放弃,“学的这么幸苦,室友都在lol,还学个P呀”。单凭意志力的学习都是刷流氓,学会给自己激励,比如学完了就能挣好多钱,就能迎娶白富美,成为人生赢家。不断在大脑中勾起这个梦想,或是去读一些鸡汤书,或是说“再不学习就成渣拉”,找到自己的G点,促使自己向梦想奋斗。

四 遇到困难了怎么办?环境不会配置怎么办?代码总是调不通怎么办?
说实话,编程的学习曲线蛮高的,而且可能并不适合所有的人,所以其实最好的办法是找到一个肯带你的,可以在你的同学,熟人中找,否则一个最简单的环境问题可能都让你头疼。如果周围没有这个环境,我想可以借助MOOC,MOOC中的国外课程可能比大多数课程都要好,但是缺点是纯英文教学,国内网易云课堂算是做的不错的,而且其价格相对比较低,比培训机构要低很多,大家有兴趣的可以看下:前端开发工程师微专业
如果周围实在找不到肯帮你的人呢,你可以先找人一起学,一个人学习是孤独的,那么一堆人就能互帮互助,共同进步了,很不幸的是,国内可能并不存在这样的环境,周围同学、同事可能打游戏的偏多。这可能就需要你自己去找个群体了。
待续.......
学习的终极目标是什么? - 知乎专栏

sevil 发表于 2023-12-4 22:36:51

昨晚在另一个地方发了个类似的回答:
哪种学习编程方式更好,系统学习还是边做边学?
昨天才进入知乎社区,不知道社区的转载主要以什么方式,所以就用最传统的方式——复制黏贴,这么转过来了。
刚注册知乎就见到了这条问题,所以就留到晚上来回答了。
虽然才毕业一年,但是因为竞赛的原因从小学低年级的时候就开始学习程序设计,直到大学读了计算机,被各种老师教导过、自学过、教过学生。
什么是编程?
我刚开始学习那时,面向对象和互联网,至少在国内,还没推广开来,甚至不多人知道。直到现在,也就现在大家见到的这个时代了。
扯这历史要说的是,“编程”对我而言从一开始的竞赛,到现在的“创作”,已经是两个范畴的概念了;同样对于时代的需求,从从前的科学计算,到现在的各个行业各个角落的各种应用实现,已经不是一个同样的行为范畴了。
但是,编程的本质上跟当年课本上写的没多大区别,就是编写(广义上的)计算机可执行的指令(集合)。
这个领域的知识是什么样的?
然后要延伸一下时代问题。
从面向对象开始,互联网时代兴起,到现在的移动互联网时代,编程绝大部分的目的是在于创造“软件”,而创造软件也由于世界上最聪明的人群高速集中涌入,以及时代的需求压力,已经形成了一整套工程学,也就是“软件工程”了。
现在“编程”被集中在“软件工程”的需求中,产生的一个结果就是“工程化”,而“工程化”就是整个生产体系开始逐步分化以及逐步专业化,从而出现了这个领域中的各种针对性专业,比如“前端工程师”、“测试工程师”、“算法分析师”、“.NET软件工程师”。
在整个软件的开发周期中,我们都需要跟不同的人在不同程度的合作。即使是个人开发者,都会用到开源的代码、各种下载的人家做好的工具。
这就是工程化后的结果,也就是“编程”被和其他不同的专业,比如数学、医学、建筑、人文等科学结合在一起然后具体地分化成了各个关联的模块。这些模块有一个特点,就是整体上“临近相连”。
这什么意思呢?
举例说明就是,但从(某个)网站开发而言,就有客户、老板、美工、前端工程师、服务端工程师、数据库管理员、网络推广等等。这些角色两两间可能有工作上的直接关联,单指这个软件项目的开发工作的话。
无论哪个是因,哪个是果,现在的情况都是没两个角色间的知识必定关联和有交集。在往广度上看,整个软件工程领域以及世界都如此,只是软件工程领域如建筑领域一般,有比较大的定量的专业化,一切都是有根据有标准的。
而至此,形成的一个结果就是,没有人能掌握所有知识;所有知识都是有关联的,追寻着关联的路径学习产生的效果普遍情况下是最大的。
后面那条可以简单地证明,假设两样知识八竿子打不着,那么你就要等很久它们才能连起来,发挥加成效用。虽然乔帮主说过,总有一天这些dots总会连起来的,但是嘛......靠谱点也不是不好。
所以,学习这个领域的知识是这样子进行的
那么,回到学习上,就变得很明确了。开发的需求需要各种技能,各种技能都是相关的,而一个项目所需要的技术在一定期限内是大致有限的。如果你要开发某样东西,或者做某种用途(比如科学计算),都需要某个知识点进行切入,从哪里都好,切入某个知识点,然后用关联的方式扩充。如果在过程中见到新的不懂的名次,要么马上去“扩充”,要么就记下来,留待以后“点亮”这个天赋,总有一天这些dots......
以上是学习编程要要知道的第一点,这个领域的知识是怎么组织的。以下第二点,关于学习方法。
一个学习的误区与结果
有句名言,是布鲁克斯(Frederick P. Brooks)说的吧,说过,最好的程序员和最差的产出差n倍。
为何?计算机科学基本上是由数学和机械类学科衍生而来,最大的特征就是两道门槛:能不能做出来、这个方法(算法或者设计)效率有多高。
前者不说,后者最明显的举例就是,用加法来计算和用乘法来计算效率差别极大。
这个领域的只是最大的特点就是它们的关系如果你想打通,是需要“理解”的,至少知道怎么用。你不懂得一个公式、一个技术怎么使用,你知道有,到需要的时候也用不了。所以钻研是一种必要的学习习惯。
看到以上内容的时候,你可能会觉得,一开始都设定好要做的目标,然后弄清楚这个范围需要的知识点,然后都从某点开始,全部学透,就能完成了。
这犯了个软件工程的一个极端化错误,在学习上也同样适用,因为每次开发都是基本上是一次学习过程,你又不是*讯,你所做的东西就算别人做过,你也一定没做过。如果别人做好了给你,也不用你做了,腾*也不用去抄了是吧?
这个错误就是将整个项目理想化,如果把这次学习视为一个项目的话。整个项目都是原本不存在这个世界上的东西,没人知道开发(学习)过程中会发生什么,怎有任何可以相信的精细的计划?
如果这么学,你会很容易陷入一个,拿了一本专业书(一个切入点),然后看,然后看着看着就看不下去了。然后?然后就没有然后了......
我们是怎么解决这个问题的
软件工程里是怎么解决这个问题的呢?敏捷开发(Agile Development),每个项目或多或少都能用到。
详细解释可能太多,毕竟我知道的也不多。不过其中最通俗的几点:将大计划切分为短周期,并且每个周期结束后调整计划,使得最近的一个计划可执行并且有效;计划中,将每次的产出进行具体化量化,每个周期都发布(生产出)有效的可用的产品,这个产品是在上一个产品的基础上的改进或者增加;在原有的产出已经难以再升级时,将原来的产品重构(重新设计、重新生产)。
细节的道理就不多说了,都出了多少本书了。
实际上现在你能买到的好的编程教学的书籍都是遵循这个教学模式,也是暂时被认为最有效的书本教学模式。这些书一般会教你从“Hello World!”(到时你就知道是什么了)开始,让你手把手做一次,然后逐步深入;有时候做了一次后,在后面介绍了新的技术,又会让你用新技术跟着做一次;看完整本书,你至少就达到了某个水平了。
要注意的是,你必须有心理准备就是,书上讲的,跟你做的根本有不同的产出,或者你根本做不到。比如书上说计算a+b会输出2,而你的输出3;书上说要点击某个按钮,但是你就是在自己机子上找不到那个按钮......这些都是不可避免的,而且一般都会浪费很长时间。莫名其妙的问题本身就是以上说的,不知道会遇到的问题的一部分,也是现代程序员加班的其中一主要原因。毕竟,你的机子跟作者的机子肯定不一样。
所以学习该是这样的
总的来说,说到了知识是关联的,学习是以不同的学习成本连接不同知识的过程。还有呢,值得鼓励的是,随着知识的增加,智力和经验会随之提高,学习成本也会降低,越来越容易学习。
虽然具体到某个知识点只有懂和不懂,但是具体到一个面,还有懂多少的问题。这就回到了刚才的引述,生产效率为什么会差n倍。因为这是一个广度和深度的综合比拼,而随着时间增长,会形成两个人知识的“马太效应”,差距会成倍增长。
不过放心吧,这个增长是有天花板的,无论是知识总量的有限还是需求有限导致的,至少从程序员的工资就可以看出来(哭)。

具体的学习建议
到这里,至上而下地给出学习建议:

[*]先有一个想法,像学钢琴也有一开始想弹奏的曲子,提出一个想用生产出来的产品,或者买一本评价好的入门书,做出书中提出的“产品”为目标
[*]将这个目标细化,可以找专业人士帮忙,梳理出知识的“切入点”以及周围的“关联点”,然后开始计划第一次迭代(做出第一样东西),可以是一段很短的程序或者一个作品,但必须有具体的产出
[*]每次产出后都重新调整计划,重要的是自己或者专业人士要能具体地评估这次产出的价值。如果是跟着书就自然容易了,就是跟书上对一下就是了
如果要具体给到一个切入点,那么我的建议是两个选择:

[*]从C语言开始,然后学习算法,走科班路线
[*]从网页制作开始,然后学习网站工程,走产品路线,这是产品中最好入门的了
不必太担心学错,因为到达工程级别,你学过的八成知识都不会被作为工具使用,而它们的只是实现了它们的历史使命——成为你现有某个实用知识的中间点/桥梁、为你现在的学习效率做了一次铺垫。
实际一点地说,对于一个“毕业了”的程序员,学习一门新的编程语言,可能只需一周,而熟悉需要三周,熟练地用于开发是三个月,精通只需一年。这也是大概而已,严谨地说,不同的语言所关联的知识点的数量是不一样的。这也不影响举例,因为在这之前,一个大学生在学习他们的第一门语言,通常是C/C++,用了一个学期,还可能挂科呢(那是态度问题或者是Dota的问题)。
首先吧,别想速成。这要能速成,那么我们专业人士不就该喝西北风去了?
所以要真解决了学习范围的问题后,你下一个问题应该是“要实现**应该具备那些知识”一类的了。等你在某个点扎根后,想的就是利用这个学习能力,去另一个自己更喜欢的领域,还是就此为据点扩充范围,亦或者深入这个领域(也是扩充的一种吧,方向不同)。
最后重申的一点,就是软件开发本身就是一个学习的过程,只是产出的代码具备不同的价值而已。软件的特殊性已经导致了难以重复地写出两段相同的代码,一般只会改写重写,或者重用原来的代码(就是复制黏贴或者引用调用)。

a2973 发表于 2023-12-4 22:37:30

没想到收到这么多赞同,有点受宠若惊,我觉得自己的经验或许对那些不是科班出身,但是又对计算机感兴趣的同学更有帮助一些。当舍友怀着满腹不解问我为什么能够在电脑前对着黑框玩一天,我会反问他为什么你可以在电脑前玩一天游戏?Just for Fun !
更多可以参考我的另一个回答
http://zhi.hu/XNm6----------------------------------------------------------------------------------------------------------------------------------

很多人都说最好通过C入门,但是我自身经验告诉我,最好先从一门脚本语言入门,如我的入门是通过PHP。
一开始接触C语言,老是对着一个黑洞洞的框,容易使人丧失兴趣。这些黑框和我们常见的QQ、Office等桌面程序相差实在太远了。而且往往在初学的时候没有人告诉我们控制台应用和图形界面的应用之间的关系。如果对Web感兴趣可以先学点基础的HTML和CSS虽然这在严格意义上不算是编程语言,但是却可以在一开始让你做出一个可以看的到的界面,而且掌握基础还是很简单的,然后在学点后台开发语言,我推荐PHP或者python。
记住,新手最重要的是保持热情!
学习一段时间之后可以自己尝试做一个简单的留言板,别小看这个老土的小东西,这个可是能让你立刻充满成就感。而如果你一开始就上手C这样的成就感就需要更久才能获得,而往往很多新手都躺在了前进的路上。然后,可以在留言板的基础上做出一个简单的博客系统。
记住一定要在每一阶段都做出一个看上去"正常"的东西,而不是一堆代码一执行出来一行行字符那种。这也是我推荐学习HTML和CSS的原因,因为这可以让你简单地搭建一个拥有用户界面的程序。
当你把这些都做完了,如果感到对编程还是有很大兴趣,而且感到自己在渐渐地从心底里喜欢上了编程,那么你再面对那些黑框的时候,就会感觉好很多,而且感到自己真的很酷,你会喜欢把自己想成电影里的黑客。
至于说算法数据结构,等有了兴趣,需要这些知识了,再去慢慢学习,都不会是障碍,而且会变得有趣许多。但是一开始没有任何程序基础,就给你学这些,只能使你迷糊,根本不了解这又什么用。这也是我讨厌现在的大学教育的一个方面,完全违背认知规律。先给你讲一大堆理论,不告诉你为什么,有什么用,让人感到厌恶,但当后来我们真正需要了,却也记不得了,只能从头再学。
最后,我还是要补充一下,对于新接触编程的童鞋,或许保持兴趣是最重要的,但是在你对编程有一定了解之后,你会发现自己还有很多困惑,这时候就需要恶补基础知识了,对底层了解的越清楚越有助于你消除困惑和对编程更深层的理解。
页: [1]
查看完整版本: 如何学习编程?