首先是基础概念、项目(系统设计)以及刷题(算法)三驾马车,这些方面可以看世界著名学校网课自行学习。
最近看到这样一个问题大学专业与计算机无任何关系,靠自学能否学好编程?让我想起当年我自学编程的一段经历。结合今天的行业现状,说说我的心得和体会。可能不一定对,让我们一起来看看。
01 非计算机专业仍可学好编程
大学专业与计算机无任何关系,仍然可以学好编程。因为计算机科学是所有专业里面历史相对较短的,直到上世纪 70 年代真正意义上的个人电脑才问世。所需要掌握的内容不算太多,和其他专业相比可以在较短时间内补齐。
A BRIEF HISTORY OF COMPUTER SCIENCE
但仅靠自学很难。因为自学比起科班出生系统学习,主要有两个难点
1)要么过于重视基础概念(computer science fundamental)忽略实际编程练习,硬将 CS 按照文科方式背诵概念学习;要么过于重视敲代码(hands-on),忽略每道题、每个任务背后的底层逻辑,知其然而不知其所以然。
2)自学的项目一般会忽略 engineering 相关的考量,而仅仅只是把题做出来、把代码敲出来。这个没有实际的大型项目的(合作)经验和老师/前辈点拨,靠自己摸索要费劲得多。
基于以上两点分析我认为在今天自学编程并达到主流公司面试标准是有很大挑战的。需要付出比 10 年前更多的努力和智慧。
包括我自己,很久以前也有一段时间自学过某个 CS 分支领域内容的经历。以前自学的优势在于市场上还没有像今天这样激烈的竞争,所以自学不需要达到很高的高度就可以通过面试,这时候真正的学习才刚刚开始。这就像开车并入高速路时那一段匝道(ramp up),给汽车一段时间的加速缓冲,达到最低要求时速后即可顺利并入高速路。可以想象如果没有这段匝道,将很难并入高速。
如果没有这段匝道,将很难并入高速
而现在市面上公司给一般自学编程的同学的机会已经不多,这段“匝道”正变得越来越短甚至消失。自己必须要想办法进入“匝道”才能开始真正的学习,从而进入 CS 行业。因为时代变了,现在 CS 科班出身的找工作都很难,更别说转专业。
02 培养编程兴趣
终归到底编程是一门非常枯燥的学科。整天和代码、数字打交道,时间久了就有可能坚持不下去。尤其是在一开始遇到一些 bug 无法解决时,会感觉非常沮丧。例如下面的情形
编程被bug不断打击,没有编程的兴趣和动力怎么办?
编程时遇到错误,一时解决不了,脾气就暴躁怎么办?
遇到暂时解决不了的问题不要慌,多想想然后向周围同学求教
为了最大化避免以上情况的发生建议从源头开始入手。在开始学习之前一定要弄清楚自己学习的动机,然后根据此动机找到符合自己特点的技术栈,尤其是自己感兴趣的技术栈进行专项学习。这样学习来才会事半功倍,毕竟
兴趣是最好的老师
兴趣是最好的老师
03 将找到工作作为学习目标
没有目标就没有学习效率。有了兴趣以后,另外一个重要环节是一定要弄清楚自己学习的目标是什么。我建议将“找到工作”作为初期学习目标,这样就能让你的学习目标变得非常清晰,而且学习方向也非常明了。
当然,正如上面第 01 章节所说,找到第一份编程工作只是相当于“进入高速路的匝道”。这时候才有机会正式系统学习各种工程化编程技能,将自己的理论知识和三脚猫功夫运用到实践中来。
找到工作只是一个新的开始,以后的路还很长。
先来看看一份标准(美国)工程师 JD,看看如果想达到这个要求需要具备哪些知识点。
图文无关
Minimum qualifications:
- BS degree in Computer Science, similar technical field of study or equivalent practical experience.
- Software development experience in one or more general purpose programming languages.
- Experience working with two or more from the following: web application development, Unix/Linux environments, mobile application development, distributed and parallel systems, machine learning, information retrieval, natural language processing, networking, developing large software systems, and/or security software development.
- Working proficiency and communication skills in verbal and written English.
Preferred qualifications:
- Master’s, PhD degree, further education or experience in engineering, computer science or other technical related field.
- Experience with one or more general purpose programming languages including but not limited to: Java, C/C++, C#, Objective C, Python, JavaScript, or Go.
- Experience developing accessible technologies.
- Interest and ability to learn other coding languages as needed.
从这里面可以看到
(加粗部分表示目前流行的技术栈)
1 基本要求:CS 本科学历或者已经掌握相关基础知识
2 掌握一门常用编程语言,包括但不限于
- Java
- C/C++
- C#
- Objective C
- Python
- JavaScript
- Go
3 在以下方面有经验
- web application development
- Unix/Linux environments
- mobile application development
- distributed and parallel systems
- machine learning, information retrieval
- natural language processing
- networking
- developing large software systems
- security software development
4 有兴趣和能力学习新的编程语言
当然,在具体面试的时候 recuriter 还会明确告诉你需要准备算法相关的技能。recuriter 会发邮件告诉你具体怎么算法相关的内容。
准备算法相关的内容
那么具体怎么根据以上要求来学习编程呢?
04 自学编程方法
我的心得是“三驾马车”法,即基础概念、项目(系统设计)以及刷题(算法)三驾马车,分别学习这三个最重要的部分
- 基础概念
- 项目(系统设计)
- 刷题(算法)
三驾马车学习法
基础概念
首先是基础概念,这些方面可以看世界著名学校网课自行学习,例如
- MIT Computer Science 免费课程(课件)
- Coursera - Introduction to Computer Science and Programming Specialization
以及我最喜欢的 Udemy
- Computer Science 101: Master the Theory Behind Programming
都是英文看起来有困难?
那你应该先自学英语,这是我当年自学的经验总结:如何正确的从零开始学英语?(见末尾扩展链接)
项目(系统设计)
当达到一定的基础时可以考虑参加一些比较正规的培训。避免广告嫌疑,这里我不列具体机构。主要是学习和培养一些 engineering 相关的理念(sense)。例如怎样开发后台来支撑较高访问量;前端秒开技术(ssr)以及中后台搭建架构等等。
刷题(算法)
同时别忘记刷题和补充基础算法知识。可以看看我的刷题方法 大家都是如何刷 LeetCode 的?
总结起来就是,了解现状 → 培养兴趣 → 以找工作为目标 → 学习三驾马车内容。最后希望你能成功。如果你在学习过程中遇到任何困难,I"m here for the help.