清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

【痴访谈】

每个月,痴海会私门拜访一位编程高手,分享ta行走江湖的绝技。

学习前人的经验,让大家编程道路走的更远。

这期的采访到的嘉宾是一位清华硕士保送学霸,现如今在阿里云工作,已经是P7的技术专家。

这期的主题:《谈谈互联网人是如何入门编程》

内容主要从下面 4 个方面进行分享:

1 如何入门,提高编程兴趣

2 积累专业知识,重视基础

3 积赞项目经验

4 勤思考,多总结

5 总结

以下是采访的原稿,希望对大家如何学习编程会有所帮助。


清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

感谢痴海大佬的邀请,让我分享关于如何入行编程、编程进阶等相关经验。

首先还是简单做个自我介绍,我是石头,本科就读于某985(CSU中南大学,专 “教如何打 CS” 的大学,也称“长沙左家垅男子高等职业技术学院”),然后硕士保送到某 Top2(THU清华大学,也叫“北京五道口职业技术学校”)。

我的专业就是软件工程,算是科班出身,在“上学”这件事情上,我自认为不算特别牛,但对自己也还算相对满意(主要是周围太多牛人了,得学会知足常乐????)。

我有运营一个公众号"程序猿石头"(ID:tangleithu),也会定期分享一些职场、技术等话题的文章。

硕士毕业之后,本人也一直从事编码相关工作,从大一开始接触计算机,至今也有 10+年头。

计算机相关专业有一个明显的好处,就是你在大学所学的相关专业知识和你就业联系得很紧密。

所以,在学校的时候,专业课就一定要好好学习和理解。

如果不是计算机相关专业呢?

前两天我一个公众号的读者朋友就比较焦虑,找我沟通说目前在某厂实习,因为不是科班出身,明显感觉和周围同期入职的科班实习生要差一些。

其实,这也没关系,从看到这篇文章的时候开始,就积极准备,弥补相应的专业知识即可。

要知道,一方面,很大一波人经历了残酷的高考后,进入大学就显得比较松散了,而此时只要你绷紧“积极主动学习”这颗弦,就已经战胜了不少人。

另一个方面,虽然科班出身有一定优势,(至少之前有接触过有一些概念),但如果不经常在某个环境中熏陶,也比较难深入掌握某个知识点的(现在比如让你回想大学学的专业课你还记得多少?)。

事实上,有很多大牛其实也并不是科班出身的。

下面,我将从以下这几个方面,谈谈自己的理解:

  1. 如何入门、提高兴趣?

  2. 积累专业知识,重视基础

  3. 积攒项目经验

  4. 勤思考、多总结

希望这篇文章会给想进入编程行业的同学,有所帮助。

1 如何入门、提高兴趣?

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

首先,“编程”的门槛相对较低,你看外面的培训机构早就从成年人延伸到越来越多的中小学生,甚至“少儿编程”了。

既然“少儿”都学,难道你还不能学么?

但整体来讲学习“编程”,特别是到后面进阶(例如数据结构和算法),是相对比较枯燥的。

所以就要想办法来提高自己的兴趣,或者说通过一步步学习来获得“成就感”反向刺激自己主动多学习。

关于入门的编程语言,我觉得不要太局限,不要太限制自己非得用某个语言入门,可以根据自己的实际情况来选择。

不过整体来讲,如果之前完全是小白,我推荐比如用 Python 等先对编程语言有个大体的了解。

掌握了一门编程语言后,其他语言都是触类旁通的,无外乎就是“顺序、选择、循环”,不同编程语言的具体语法不一样而已。

然后对于常规的面向过程的 C 语言,或者面向对象的 Java 等也建议都了解和学习一下。

记得我当初上大学的时候接触的第一门编程语言就是“VB”,我想学校安排的课程先后顺序还是很有道理的。

用 VB,在 VisualStudio 上简单用鼠标拖一拖就能出来一个有用户界面、可交互的像模像样的“软件”,这对于上面提到的用“成就感”来激励自己主动多学习还是很有效果的。

比如当初课程大作业就是写一个计算器,通过短时间的入门学习,就能写一个这样的计算器软件出来,确实还是颇有成就感。

这其实就跟现在的少儿编程一个道理,用一些可视化的编程平台让小朋友通过简单的拖拽,加上少部分逻辑就能出一个非常“炫丽”的效果,就跟玩游戏一样,这当然能激发足够的兴趣。

再比如刚开始入门就选择 C 语言或者汇编,这对于提高兴趣、想获得“成就感”来起到激励作用就大打折扣了。

我记得当初课程学习 C 语言时,最后作业都只有在黑屏控制台下,虽然也能完成差不多的功能,但从“可观赏性”来讲就差太多了。

小结一下:入门编程,就是先学一门比较好上手的编程语言,通过尝试写一些有用户界面(比如 HTML+JS)的小项目、小 Demo 来激励自己。

2 积累专业知识,重视基础

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

有了一两门编程语言作为基础后,这个环节就是真正体现编程水平的时候,也是最能和其他人拉开差距的部分。

有哪些专业知识呢?

就以我本科 CSU 大学给安排的课程来挨个阐述。

我还特意去翻了下我之前的成绩单,有各个学期的各个课程安排。

  • 可视化程序设计基础:其实就是上面提到的 VB,通过可视化的效果来正向反馈自己学习。其实,也可以通过比如用 HTML+JS 来体验一下,对“编程”有个直观感受作为入门也不错。

  • C/C++程序设计基础:C/C++ 还是非常基础的,建议入门编程之后都掌握一下。

  • 离散数学:离散数学对锻炼逻辑思维等还是有很大的帮助。印象中当初老师直接在课上跟我们玩了一个“数十八罗汉” 游戏,就利用了离散数学里面的思想让老师能够保证赢。

  • 数据结构:这个不言而喻,后文详述。

  • 算法分析和设计:这个不言而喻,后文详述。

  • 汇编语言程序设计:这门课程有利于让大家理解自己写的代码是怎样被计算机认识,底层是如何运转的。推荐学习,书籍可推荐王爽的《汇编语言》。

  • 操作系统:随便列几个话题,看看其中的分量。进程、线程、死锁,内存管理、进程调度、任务调度等等,是不是现在工作中也离不开。推荐参考书籍如:《深入理解计算机系统》、《操作系统导论》。

  • 计算机网络:TCP/IP,路由,网络 7 层/ 4 层协议,HTTP,DNS 等等。推荐参考书籍:《计算机网络-自顶向下方法》、《TCP/IP详解》等。

  • 数据库系统:ACID,做开发也绕不开的话题。推荐书籍:《数据库系统概念》、《高性能MySQL》等。

  • 编译原理:跟上面的汇编一样,有利于了解程序背后是如何运转。这门课也比较难,印象中是我当初所有专业课中,本人考试得分最低的一门,????。词法分析、语法分析、语义分析,中间代码生成优化等等。建议一般人有个大概了解。推荐书籍《编译原理》。

以上是我挑选的部分专业课程,其中相关书籍的推荐仅供参考。

其他的课程还有诸如:计算机图形学、软件测试、软件体系结构、设计模式、软件度量和应用等。

从中可看出,正如我前面所说计算机相关的专业基础知识和就业联系得很紧密。

如果是在校生,就一定不要浪费时间、抓住这些专业课程的学习机会。

不然毕业后从事了编程这个行业,也还是会回到这些基础知识上,正所谓“欠下的债,迟早都是要还的”。

况且,学校的课程学得好,还能帮助获得奖学金、保研、找工作等等,一举多得,何乐而不为呢?

就拿我来说,自认为不是特别聪明,但我足够努力呀。

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

因我出生在农村,接触电脑比较晚,但在大学的时候相对比较勤奋,学好专业课程,各种奖学金拿得手软(得交学费呀,软件工程专业的学费可不便宜呢),最后又成功保研清华。

当然,考得好就不一定等于专业课程学得好,但学得好总是对自己有好处的。

其中,上面提到的“’数据结构和算法”这个确实是我认为的重中之重,就算在精力有限的情况下,其他可以放松些,但也不要放过这个话题。

从我之前写的《有了这份程序员面试指南,你离大厂Offer还远吗?| 附推荐书籍》这篇文章中也可以看到,数据结构和算法一直是各大公司面试考察的重点。

好在现在网络资源很发达,网上有各种不错的课程可以学习。

这里我推荐,清华大学学堂在线的在线课程《数据结构》,分为基础和高级上下两门课程。

这门课程是国家精品课程,由邓俊辉老师讲授,在学校时,我上过邓老师的几门课程,真的很赞,他在讲授“数据结构”和“计算几何”方面拥有20多年的经验,课堂用的 PPT 和动画效果也特别赞。

最关键的是,这课程可直接免费白piao,不香吗?

有很多人说数据结构和算法没用?那只是他觉得没用而已,或者他的工作当中没用而已。

我一直有个观念就是,程序员这个群体本身也是符合金字塔模型的,不一定非得每个人都是编程高手,找到适合自己的,自己待着最舒服的位置就是棒棒哒。

我在之前的这篇文章也阐述了对待基础知识的看法——《从一道面试题谈谈一线大厂码农应该具备的基本能力》,因为在日常有些场景下,“复制粘贴”工程师貌似也够用了。

遇到问题有更高水平的人来帮你解决就行,大家都一样的话,怎么体现高手水平呢?

不过从用人单位角度想,当然是更希望招聘更加优秀的选手,怎样体现优秀呢?

候选人基数太大,怎么筛选,其实也就“高考”一样嘛,通过“考试”择优录取而已。

有时候感觉大部分程序员都被大量的需求压迫着,被产品经理催促着,仓促地码着繁琐的业务代码,不断的改着 Bug 又引入新的 Bug。

业务代码重要么,当然重要(代码就是服务于具体业务的)。

但同时也还是希望我们不要抛弃一些基础的东西,多培养一下我们的编程素养。

我们在用编程语言,利用各种工具来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”岂不更好?

更何况很多时候要解决的问题,恰恰是需要上面提到的专业基础知识的积累。

3 积赞项目经验

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

前面提到的入门也好,基础知识也好,其实最终是为“项目”、为“产品”服务的。

在校生或者刚入门没有“项目”,没有“产品”怎么办,那就自己制造机会。

为什么要做项目呢,因为一个完整的项目是可以比较系统的,是一个可以把理论付诸实践的机会。

从某种程度上讲,做一个或大或小的项目,也能起到跟前文所说的正向激励的作用。

例如我在本科期间,就做了几个小项目,现在列举两个典型供大家参考。

例如,学完 Java 编程、数据库等课程后,是不是也可以自己来搞个小聊天工具呢?

再比如,学了 Java Web 开发,是不是可以搞个类似的图书管理系统、校园 SNS 之类(当初人人网很????啊)的玩玩?

下面就来看看我上学期间搞的两个小项目吧,供参考。

3.1 ICHAT聊天系统

这个就能对自己的学习有一个阶段性、系统性的总结,在当初看来确实还是蛮有成就感的。

其实做一个,各种场合都能用,比如课程 A 的大作业可以用,稍微改吧改吧,课程 B 的也能接着用,一举多得。用心做,不仅自己知识点 get 到了,各个课程作业又能得高分。????

这个系统主要是仿照QQ聊天软件,其功能模块包括:私聊、群聊、语音聊天、视频聊天,用到的主要技术点:C/S 体系结构,Oracle数据库、socket、多线程、swing等等。

当初做完了语音、视频聊天,还是很让人眼前一亮的。

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

▲ 视频聊天(当初石头好青涩)

▼发送文件

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

看截图,是不是还像模像样的。

用这个小项目来入门练手,还真是个不错的选择。有足够的挑战,同时也有足够的趣味性和成就感。

3.2 基于中国移动飞信的校园资讯网

这个项目是基于WEB网络的校园资讯网,项目分析了飞信协议(其实就是利用网络资源改写一个web飞信),利用飞信功能可以进行个人日程提醒、订阅天气、好友生日提醒、课程提醒等等;(时光荏苒,飞信?用过的说明你也“老”了

主要技术点:项目采用Struts+Hibernate框架开发,httpclient+htmlparser分析教务管理系统流程获取有用信息,利用webservices获得谷歌天气信息,将这些有用信息通过飞信发送给用户。

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

▲登录飞信

▼ 爬课程、成绩

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

这个小项目也是源于生活。当初当了个小班长,每期末都要统计成绩,计算综合测评等,想想,何不写个爬虫来爬呢。

有时候,程序猿的“懒”就是为了提高效率。

类似的小项目可以达到阶段性总结的目的,同时自己的积累和总结也是自己的一笔财富,且无形之中可以让自己将来也获益。

举个????例子,比如我上面的项目总结和积累,可以帮助我后面获取更多的机会。

例如当初我搞了个小团队,参与了大学生创新性实验项目,获得了国家 2 万元的项目研究资助,还发了小论文(虽然现在看来很水),后期在简历中也有加分。

比如在我大三的时候,就获得了腾讯的实习机会,参与了真正的商业产品的开发。

再后来,前面的积累又帮助我全奖保研到清华读研(清华录取外校的学硕名额是相当少的)。

4 勤思考、多总结

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

这个其实不必多说。不管那个行当,做到 “勤思考、多总结” 百利无一害。

我在《10 年 bloger 告诉你要不要写博客,又该如何优雅地写博客?》这篇文章中也提到了,我其实当初最初玩 blog,更多的就是抱着学习总结的态度。

哪怕正式工作之后,写周报、月报等也都是阶段性的总结,再比如晋升答辩等等都是需要你日常的思考积累和总结的。

反正将来都会用得着,何不现在就开始锻炼呢。

在日常学习和工作之中,我们看到一个问题的时候,要学会思考背后的道理,比如在接到某个需求的时候:

思考这个需求最终是要解决具体什么问题?

有没有更好的解决方案?

在阅读某段代码,思考原作者为什么要这么设计?

就比如看到这段代码,你能否多思考一下其中的奥秘?

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

上述代码中,比较两个字符串是否相等,按道理,其实中间某位不相等就可以直接返回了,但为啥要遍历完了再返回。

这么做的目的是什么?在问了为什么之后,你可能就会知道,原来这么做是为了防止计时攻击

完整文章可参考本人写的这篇文章——《这 10 行比较字符串相等的代码给我整懵了,不信你也来看看》。

比如痴海大佬,肯定就做到了这一条,才会有目前取得的成绩,不得不佩服。

5 总结

整体来讲,针对“入门进阶编程”这个话题,我谈了谈自己的理解,重点还是要重视基础,通过小项目正向激励自己多主动学习,然后做到勤思考,多总结

最后再次感谢痴海小哥的邀请,痴海同学年轻有为,文章质量很不错,是学习的不错资料。

期望大家跟着各位大佬的提纲,再加上自己多勤奋努力学习,一定能取得巨大的进步。


最后非常感谢石头哥的分享,他也是一位乐于写作输出的大佬。有个自己的公众号"程序猿石头",会定期分享一些技术干货、职场经验等。

如果大家对阿里或者其他大厂感兴趣,也可以找石头哥内推,石头哥可以帮忙提供简历 review 等。

大家扫码下面二维码即可关注石头哥的公众号,和清华大佬面对交流讨论,大家一起学习、共同进步。

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈
扫码回复"痴海",送大厂面试指南

最后如果你觉得本文不错,“关注+转发+右下角”,一条龙走起,我就当你打赏了 66 元了。

最下方是我的私人微信,工作忙读者多,我不可能有问必答,但添加后你可以:

 

1.偷窥朋友圈私货

2.获取年薪 50W 的 Python 资料

3.加入即将创建 Python 编程交流群

4.用一次简单的加好友动作,试试能否给自己的人生多一次认知升级的机会。 

 

清华硕士保送,现阿里 P7 谈如何入门编程 | 痴访谈

当然只有小孩会做选择。

“我全都要“。