软件小白入门记:
当我刚开始学习软件开拓的时候,我根本毫无头绪。

我觉得很沮丧。所有的东西我都看不懂,我乃至不认为我可以“节制”编程。
我之以是见告你这点是由于我以为既然你选择了我这本书,解释你可能跟我那时的觉得是一样的。
不要担心,这很正常。事实上,这根本便是常态。
让我来彻底澄清一件事:你不须要是一个天才,乃至智力水平不须要超过均匀水平,也能成为一个软件开拓者。
对付一个刚刚进入软件开拓大门的初学者,如果你没有以为茫然,并觉得自己像是被在脚踝上绑着重物丢进池底的话,你可能是哪里做错了,也可能你压根就不是一个普通人——或者二者皆是。
无论如何,你该当清楚刚入门的时候是会觉得困难和混乱的,但是这种状态不会持续太久的——我向你担保。
我是如何起步的
依稀记得当我开始自学编程的时候。那时候并没有像现在这么多的编程资料。事实上,我根本没有任何的资料。
我去下载了一个很盛行的 MUD 源码(Multi-User Dungeon 多人地下城,你可以将它想像成一个基于文本的魔兽天下,毕竟那是一个利用调制解调器进行拨号上网的时期)。
但是我根本搞不懂我看的代码是什么意思。我所知道的只是我想创建一个属于自己的修正版 MUD 并为其添加新的特性,而要达到这个目标的关键就隐蔽在这一堆看不懂的神秘文本中。
于是我开始瞎搞,我修正了某些变量的值。我试图去探求掌握暴击机率的代码,并对其进行修正,重新编译,然后看看会发生什么。
有时候它照我的预想运行了,而有时候它根本编译不起来。在探索代码可以运行和不能运行的过程中,我已经学习到东西了。
我依然不懂我所修正的东西,但是经由了一个星期旁边的“瞎搞”,我居然真的创建出了一个有我自己添加过功能特性的新版本 MUD。
成为一个娴熟的程序员还有很长的路要走,但我已经开始了 —— 所有人都须要一个开始。
我讲这个故事是想让你明白,比较直接拿起一本书,比较客岁夜学或者培训机构,比较其它任何事情...这才是入门编程的精确办法。
你必须自己熟习代码,理解哪些办法可以让它事情,而其它办法弗成。(我确信这才是学习的最佳办法。请参考我的软技能一书中关于学习的章节。)
但是,学习如何编码跟如何进入到软件开拓的天下之间还是有很大差异的。
没错,你必须先学会编码,但是软件开拓并不仅仅是写代码,本章讲的便是关于代码之外的那些技能。
理解这个职业
首先,你须要理解一些软件开拓的知识。
它比你想像中要来得随意马虎,也要来得难。
本书有一全体小节专门讲述“软件开拓所要节制的技能”,但是我想先要这里做一个快速的综述。
软件开拓并非只是写代码。编程是个中很大的一部分,但是如果只会编程的话,你可能走不了太远 —— 特殊是当你想从事情中脱颖而出的话。
软件开拓背后的思想是将手动的过程自动化,或者是创造一个新的自动化过程来完成一些无法利用手动完成的事情。
想像一下我现在正在利用的笔墨处理软件。我正在利用 Google Docs 写这篇文章。
如果没有 Google Docs 或者其它的笔墨处理软件,我就必须利用打字机或者手写的办法来写文章。
如果我想要对文章进行格式化,我就必须在打印前手动进行排版。
如果我想修正一些缺点 —— 特殊是拼写缺点 —— 的时候,我须要在手边放上一瓶涂改液。(可能还须要一瓶威士忌。)
当然,现在不仅仅有 Google Docs 可以帮助我完成这些事情。还有很多其它的硬件或者软件可以帮我将手写或者排版的过程自动化,但是我想你已经明白我的意思了。
因此,在你上车之前,我须要特殊强调一件事,这件事你越早知道越好。
在将一件本家儿动化之前,你必须知道如何手动完成它。
理解需求
太多有抱负 —— 同时也是有履历 —— 的开拓者在没有完备理解软件功能需求的情形下进行开拓。他们齐心专心只想着写代码。(这对付学习编码来说没有问题 —— 就像上面 MUD 的例子 —— 但对付开拓一个企业级软件却是行不通的。)
当然,你比他们更机警,由于现在在看这本书。
弄清楚待办理的问题是所有软件开拓过程的第一步。你想实现自动化过程的是什么?
针对这个问题,不同的软件开拓模式有不同的办法,不过对我们来说,目前那并不主要。现在最主要的是,你须要通过某些方法,去网络需求并在开拓真正编码之前理解你须要办理的问题是什么。
这件事可以很随意,跟潜在的客户谈论下他想要的软件,以及这个软件有哪些功能。也可以很正式,编写一份标准的文档解释。
设计
一旦你明白需求是什么,你就可以开始设计如何利用代码完成这个需求了 —— 再次地,你须要在动手写代码之前完成设计。
可以把它视为你的代码架构蓝图。同样的,不同的软件开拓模式有不同的方法来办理这个问题,但现阶段最主要的还是你须要在开拓编码之提高行某种程度上的设计。
这对付不同规模的软件都适用。有些学习过敏捷开拓(会在之后的章节中谈论到)的程序员以为他们不须要任何设计,只须要开始编码就行了。虽然事前设计不是敏捷开拓的主要,但是设计仍是必要的。
你不可能随随便便就写出一个软件来。
编码
只要设计完成后,你就可以开始针对这个软件的功能编写一些测试了(也便是测试驱动开拓或 TDD),也可以直接开始写代码了。(我们会在后面的章节讲到 TDD。)
编码是一个专门的主题,以是在这里我并不会详细展开,不过我想推举两本必读的关于如何写出好代码的书。
首先,我推举 Steve McConnell 的《代码大全》,这是一本所有程序员都必读的经典书本。
第二本是 Rober Martin 的《代码整洁之道》,教你如何写出更好代码的另一本经典书本。
用现在的话讲便是,这两本书可以教你如何写出优雅的代码,即有良好的可读性,同时易于掩护。
这两本书对我的编码技能有非常深远的影响,特殊是在于代码的清晰性和设计上。
测试及发布
一旦编码完成了,我们就该发布了,不是吗?
错!
现在进入到了对代码进行测试的流程。还是那句话,不同的开拓模式有不同的办法来处理这个问题,但是常日来说,在软件正式发布给用户之前都须要进行某种程度上的测试。
比如对付传统的瀑布流开拓模式,测试阶段处于全体软件开拓过程的末期。但是,在敏捷项目中,在每一个迭代过程中都须要进行测试,每个迭代常日为 2 个星期旁边。
一旦代码测试完成了,就开始进行发布了,关于发布也有它自己完全独立的流程。
我们现在还不会深入到细节中 —— 后面会有一整章专门谈论这个问题 ——,但是发布流程实在便是将开拓完成的软件支配到做事器上,在 app store 上架,或者利用其它可以让用户获取到软件的办法。(这个过程可以相称繁芜。)
在这个过程中,代码可能 —— 好吧,实在是必须 —— 被存放到源码仓库中,这个源码仓库会管理不同版本的代码,并且它在开拓过程中的变革都会被存储下来。
在某些比较繁芜的运用中,会涉及到数据的存储,这里我们还须要用到数据库。
数据库常日会用来存储运用的用户数据,或者一些配置信息,而这些数据也都须要跟随代码一起更新。
很多软件开拓团队会利用某种形式的持续集成环境,它可以在代码被提交的时候自动进行构建。
编程不仅仅是写代码
末了,别忘了调试。作为一个开拓者,你的大部分韶光将会花在搞清楚为何你的 —— 或者别人的 —— 代码不能正常事情。
如你所见,软件开拓可不仅仅是写代码这么大略。
在你找到一份真正的程序员事情之前,你须要对所有的这些技能有所理解。更进一步地,但愿你对这个中的某些技能能达到闇练的程度。
不症结怕,帮你达到上面的目标便是我写作这本书的目的 —— 或者至少给你指明一个精确的方向。你可能须要自己去学习所有的技能,但是至少我会见告你如何去学习它们。
制订一个操持
好吧,John,现在我已经明白了软件开拓不仅仅是写代码,并且我乐意花很多韶光去进行调试,但是你还没见告我如何入门呢?怎么说?
唔,是的。我明白你的意思,但是你知道吗?我有一个好见告你:你已经入门了。恭喜。
在你拿起一本书,就像这本一样,并且开始理解软件开拓不仅仅是写代码时,你已经比其他大多数的开拓者有一个更好的开始了。
没错,没错,这种说法是有点自我觉得良好,但是它确实是真的。有一天当你成为一个像我一样老成的软件开拓时,你也会说同样的话。
现在,让我们讲点更实用的,你须要制订一个操持。
是的,便是一个操持。一个真正的,不瞎逼逼的操持,它能让你从对软件开拓一无所知(或者靠近一无所知)发展为一个履历丰富的开拓者。
你有很多不同的路可以走 —— 我会在后面的章节中逐一先容 —— 但是选哪条路不是最主要的,更加主要的是你要选一条路,并坚持走下去。
整合操持
让我们看看你的操持该当是什么样的。
首先,你须要对自己当前的水平有一个精确的评估,同时搞清楚须要学习哪些知识。
你有任何软件开拓的履历吗?
你理解任何一门软件开拓措辞吗?
你之前写过任何运用吗,或者你完完备全便是从零开始?
我前面提到的其它技能呢?
你有没有节制它们中的任何一项?
你对数据库,源码版本掌握,测试驱动开拓,测试,调试或者软件开拓模式有任何的理解吗?
同时,问问你自己想做哪个方向的软件开拓。
很多新手可能都想做游戏开拓,但是这现实吗?如果是的话,你要从哪里开始?你有没有做好觉悟,投入大量的韶光去应对寻衅,去走这条很长并且很孤独的道路?
太多的人在没有经由任何的事前思考的情形下就朝着某个方向出发了。
花些韶光去回答这些问题,这样你就会在开始前有一个合理清晰的操持。
不要误解我的意思,我当然会在本书中只管即便帮助你办理这些问题,但是我不能代替你做全部的事情。
我能够给你供应成为一个好的,乃至是精良开拓者的所有信息,但是你须要自己将这些信息进行整合并制订一个适宜自己的操持,然后照着这个操持走。
创建操持
一旦你对这些问题有了自己的思考,就到真正创建一个操持的时候了。
创建操持的最好办法便是从你想达到的目标进行倒推。
比较于“学习如何编程”或者“成为一个软件开拓者”,你要对自己想成为哪个方向的开拓有更明确的目标。
在本书的“你所须要节制的软件开拓知识”小节中,我会先容不同的软件开拓角色与事情类型以供你选择,你也可以自行上网搜索,来决定确定哪个最适宜你。
你的目标要越详细越好,这样一来,你就可以知道自己须要学习哪些知识,如何制作简历以及作品集,想进入什么学校或者培训机构,乃至是应聘什么样的事情。
我知道做出选择和下定决心有多困难,但是关于目标的主要性我再怎么强调也不为过。
这个目标越详细,后续的学习就越随意马虎。你会清楚地知道每一步须要学习什么知识,以及如何行动。
谁想成为一个“运动员”?
思考一下这个问题:假设你的目标是成为一个“运动员”。
这个目标就太宽泛了,你要如何演习自己成为一个“运动员”?
可能你会去举重和跑步,也有可能去演习拍浮。同时,你还会去网球场上练习击球。
你会努力地去做所有运动演习,好让自己在终极决定时,可以加入任何一个运动团队。
这听起来很荒谬,对不对?这就跟有人想成为“软件开拓者”一样 —— 实际上愈甚 —— 荒谬。
相反地,你须要一开始就选定一项运动。
一旦你选定了这项运行,你就可以知道如何针对这项运行进行演习,这会让你活得更轻松 —— 相信我。
从目标开始进行倒推来确定达到这个目标所须要的知识和行动。一旦你完成这个步骤,就可以真正开始制订操持了。
操持的一开始该当是环绕所有你须要学习的技能。弄清楚所有这些知识的学习顺序,以及如何进行学习是至关主要的。
接着,你要弄清楚应聘一个岗位以及找到第一份事情须要准备哪些东西。
末了,你要为得到这份事情定一个确切的操持。你要在哪里找事情?你须要做什么?你申请的是什么样类型的事情?
我可能还会为你增加一个操持,那便是在找到第一份事情后,如何连续提升自己的开拓能力及学习更多的知识。
这里的信息量可能有点多,但不要担心。我写这本书的目的便是为了让所有的这些对你来说都变得更加大略。
在接下来的几章中,我会帮你弄清楚你所要节制的技能以及如何学习这些技能,在更后面的章节中,我会给你描述得到一份事情的所有细节。
现在,你可以开始思考你的操持该当是什么样的,以及考试测验思考自己想成为哪种类型的软件开拓者。
Hey John
但是我真的不知道自己想成为哪种类型的开拓者?
这是一个好问题。如果你是一个初学者,你乃至可能都不知道有哪些选择可以选 —— 除了游戏开拓者。
幸运的是,这并不是一个很难弄清楚的问题 —— 虽然须要你进行一下网上搜索。
在这本书的后面,我会谈论一些软件开拓者的类型。大多是在“你所须要节制的软件开拓知识”一节中,但是同时你也须要进行自己的搜索。
问一些你认识的软件开拓者,他们做的是何种软件开拓,以及他们是何种类型的软件开拓者。
思考一下你对创造哪些东西更感兴趣,并搜索一下这个东西的干系技能及编程措辞。
对付一个软件开拓者来说,现在有太多的技能和干系的细分领域了。
你想开拓 web 运用程序吗?手机运用呢?你想写代码来掌握冰箱的恒温还是想向宇宙中发送宇航员?
仔细思考这些问题并进行搜索。如果你的问题是对的,那么答案就不会那么难找了。
一个详细的例子
我一贯都以为实例会起到很大的浸染,以是现在我们来看一个真实的场景,一个想以 Node.js 为紧张技能的 web 开拓者的操持:
目标:成为一个 Node.js 开拓者
操持:
学习
学习 JavaScript 根本
学习网页与 web 开拓技能,如 HTML 与 CSS
学习 Node.js 根本
可以利用 Node.js 开拓一些大略的 web 运用
学习不同的框架以及其它开拓者用来开拓 Node.js 运用的技能。
从上面的搜索中理解一些可以利用的技能及框架。
学习 Node.js 支持的某种数据库技能。
学习打算机科学根本:
算法。
数据构造。
学习写清晰代码的最佳实践。
学习如何设计 Node.js 运用的架构。
为找事情做准备
开始探求在自己领域中的 Node.js 开拓者的事情哀求,并确定公司须要哪些技能。
列表出你最有可能得到事情确当地公司列表。
开始参加本地的技能分享会。
在网络上认识其它确当地 Node.js 开拓者。
雇一个简历写手来帮助自己写一份好的简历。
练习技能口试的干系问题。
仿照口试。
建立一些 demo 运用的浸染集供展示。
得到事情
联系自己网络上的所有人,让他们知道自己能供应什么样的代价以及我正在探求哪种事情。
开始申请低级或者演习岗位的事情。
操持每天至少应聘两个公司。
口试后进行复盘,并决定哪些技能须要深入学习。
的操持一开始会很粗糙,但是随着你对须要学习的内容有了更多的理解,就可以在操持中补充更多的细节了。
在一开始就准备好操持是相称主要的。你可以随时修正或者调度操持,但是如果你在一开始没有操持,你会像无头苍蝇一样乱撞,这有极大的可能导致沮丧并放弃学习。以是一定给足自己十足的后劲,且不可半途而废,加油!
!
!
喜好的朋友们可以帮忙关注一下,感激了。。。







