读书笔记:

笔者是一个稍微有点编程基础的人,学习python一开始是从吴恩达的视频入门的,但是直接套用框架,使用模块,对python的语法却不甚了解,我也试过直接去廖雪峰的python学习网站上面学习,学得睡意朦胧。这本书,在我花了三天时间学习完之后,发现的确是一本比较好的入门书籍,所以在此推荐给大家。

这本书并不包含所有的细节,因为很多细节都能单独出书,作者在很多地方也是浅尝辄止,介绍完最基本的概念和操作就进入了下一个话题,所以其实有优有劣,但也因为可以让你保持着充足的好奇心和动力继续阅读。书本结构非常清晰,从概念介绍,到操作说明,每段代码都有详细的解释,紧接着还有对之前出现过的本章的术语的说明,最后搭配一些简单的课后题。

 

书籍简介:

《Python编程无师自通——专业程序员的养成》作者科里•奥尔索夫是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。

这本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。

《Python编程无师自通——专业程序员的养成》

作者:[美] 科里•奥尔索夫(Cory Althoff)

书籍和源码链接只有聪明的人才能拼凑起来

关于python的一些学习细节,这里就不再赘述了,主要是书本的第一和第二部分,比较新颖的是之后的章节。第三部分讲解了一些程序员必备的编程工具,主要介绍了Bash(命令行接口)、正则表达式、包管理器、版本控制以及如何用python进行简单的爬虫,第四部分简单讲解了计算机科学中常用的数据结构和算法知识,最后一部分讲解了他在学习和找工作的过程中所获得经验,我觉得这部分比较重要和有用,所以我将在下方简单罗列一下:

https://pan.baidu/s/

普遍的编程原则:

1、写代码是最后的手段
       作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案。先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。


2、DRY
       DRY是不要重复自己(Dont't Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。


3、正交性
       正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一个重要编程原则。亨特和托马斯认为,“该术语已经被用来表示某种独立性或解祸化。如果两个或多个事物之问的变化不会相互影响,那么它们之问就存在正交性。在设计优良的系统中,数据库代码与用户界面之问是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。”实践中记,"A不应该影响B"。假设我们有两个模块module a和module b,module a不应对module b中的内容进行修改,反之亦然。如果设计的系统中A会影响到B,而B又影响C,很快就会失去控制,系统将变得无法管理。

12nH904OWPley


4、每个数据都只应保存在一处
       假设手上有一个数据,我们只需要将其存储在一个地方。例如,我们正在开发用来处理手机号码的软件,其中有两个函数要使用地区编号的列表,这里要确保程序中只有一个地区编号列表,而不是为每个函数重复创建。正确的做法是创建一个保存地区编号的全局变量。更好的解决方案则是将信息保存在文件或数据库中。


5、函数只做一件事
       我们写的每个函数应该只做一件事。如果发现函数太长,请检查其是否在完成多个任务。将函数限制为只完成一个任务有很多好处。首先,代码可读性增强,因为函数名称可以直接说明其功能。如果代码出错,调试也将更加方便,因为每个函数只负责一个特定的任务,我们可以快速隔离并调试问题函数。用许多知名程序员的话来说:“软件的复杂性大多源自试图两件事当一件事做。”


6、若耗费时间过长,你的做法很可能就是错的
       如果你不是在处理非常复杂的问题,比如处理大数据,但是程序却要花很长时问才能加载,这时可以认为你的做法很有可能错了。


7、第一次就要用最佳的方法完成
       在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。

 

8、遵循惯例
       学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8是一系列编写Python代码的指南,强烈建议阅读,可前往https://www.python/dev/peps/pep-0008/查看。


9、使用强大的IDE
       到目前为止,我们一直使用的是Python自带的 IDLE来编码。但是IDLE只是众多可选IDE中的一个,而且我也不推荐长期使用它,因为其功能有限。例如,如果使用更强大的IDE打开Python项目,每个Python文件都会有不同的选项卡。在IDLE中则是每个文件新开一个窗口,操作烦琐且文件之问来回切换困难。
       笔者使用JetBrains公司开发的一款名为PyCharm的IDE。他们提供了免费版和专业版两个版本,这款IDE有如下特性能够帮助我们节省时问。

7MsVz4DZBw

10、记录日志
       记录日志(logging)指的是在软件运行时记录数据的做法。我们可通过日志来协助程序调试,更好地了解程序运行时的状态。Python自带了一个logging日志模块,支持在控制台或文件中记录日志。
       程序出错时,我们不希望没有感知—我们应该记录下相关信息,方便以后核查。记录日志也有助于收集和分析信息。例如,可以搭建一个Web服务器来记录数据,包括每次收到请求的日期和时问。我们可以将所有的日志记录在数据库中,编写程序分析其中的数据,并生成图表展示访问网站的人次。
       博客作者亨瑞克·沃纳(Henrik Warne在博客中写过这样一段话:“伟大程序员与平庸程序员的区别之一,就是伟大的程序员会做日志记录,使得出错时的调试变得更简单。”可查看https://docs.python/3/howto/logging.html中的教程,学习如何使用自带的
logging模块。

提取码: jqff


11、测试
       程序测试指的是检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,并且实现了相关利益方所期待的效果。”为了进行程序测试,程序员要额外编写程序。
       在生产环境中,测试是必须完成的。对于计划部署在生产环境的程序,我们应当认为在没有编写测试之前都是不完整的。但是,如果是一个不会再使用的临时程序,测试可能有些浪费时问。如果编写的是其他人也将使用的程序,则应该编写测试。很多知名程序员都曾说过:“未经测试的代码就是漏洞百出的代码。”可在网页https://docs.python/3/library/unittest.html学习如何使用Python自带的unittest模块。


12、代码审查
       在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说。即使你遵守了本章中所列的所有最佳实践,也有可能存在错误的做法。你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决。
       Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码。社区的其他成员会审查代码,并反馈做得好的地方以及可以改进的地方。网站地址为:http://codereview.stackexchange


13、安全
       对于自学的程序员来说,安全是一个很容易忽视的问题。在面试时也很少会被问到安全问题,在学习编程时我们也不会去考虑安全问题。但是,在实际工作中,我们需要对自己代码的安全性负直接责任。本节将给出几个提高代码安全性的建议。
       我们在本书中已经学习了使用sudo命令以根用户的身份执行命令。非必要情况下,务必不要在命令行使用sudo执行命令,因为如果有黑客侵入程序的话,将会获得根访问权限。如果你是服务器管理员,还应该禁止根用户登录。每个黑客都会盯着根账号,在攻击系统时是首要选择的目标。
       另外,总是假设用户的输入是恶意的。部分恶意攻击的发生,就是利用了可接受用户输入的程序漏洞,因此我们要假设所有的用户输入都是恶意的,并以此为依据进行编码。
       另一个提高代码安全性的策略,是最小化你的攻击面积(attack surface,即黑客可从程序中提取数据或攻击系统的相关区域。通过最小化攻击面积,可以减少程序出现漏洞的可能性。最小化攻击面积的儿种常见做法包括:避免保存敏感信息,赋予用户最低的访问权限,尽可能少用第三方库(代码量越小、漏洞越少),剔除不再使用的功能代码(代码量越小、漏洞越少)等。
       避免以根用户身份登录系统,不要信任用户输入,以及最小化攻击面积,是确保程序安全性的儿个重要手段。但这还只是提升安全性的一小部分。我们应该试着从黑客的角度进行思考。他们会如何利用你的代码?这样可以帮助我们找到之前可能忽略的漏洞。有关安全的话题非常大,不是本书所能涵盖的,因此建议大家时刻思考并学习如何提升安全性。布鲁斯·舒奈尔(Bruce Schneier)对此的总结十分精辟:“安全是一种思维状态。”

 

寻找工作和继续提升:

(1)寻找方向

       python的方向有不少,web开发和移动开发是两个非常流行的编程方向,包含前端后端或全栈,另外在数据处理和预测、自然语言处理、图像处理、人工智能等等方向,python也有不俗的应用。

 

(2)积累初期经验

       在成功应聘上第一个编程工作前,你需要积累经验。但是如果没有公司愿意在你没有经验的情况下雇佣你,怎么积累经验呢?有儿个解决办法。首先,你可以参与开源项目,自己启动一个开源项目或向GitHub上的其他开源项目提交代码。
       另一个方式是做外包。在Upwork等类似网站创建账号,试着申请规模较小的编程工作。我建议去找确实有编程外包需求的朋友,让他们在Upwork等网站注册账号,然后正式雇用你完成任务。这样后续可以给你很不错的评价。其他人看到你至少成功完成了一项工作之后,被雇佣的概率就会提高,因为你已经成功建立了可信度。

 

(3)拿到面试机会

       通过开源项目获外部工作成功积累编程经验后,可以开始寻找面试机会。我发现一个有效地获取面试机会的方法,就是通过LinkdedIn。如果你还没有LinkedIn账号,建议创建账号并试着与潜在雇主进行沟通。在个人档案中留下自我描述,突出自己的编程能力。例如,很多人会在档案上这样写,“编程语言:Python, JavaScript",会吸引来不少关注这些关键词的招聘者。务必将自己的开源项目或外包经验列为近期的工作。
       完善个人档案后,可以开始与技术招聘人联系。LinkedIn上有许多技术招聘人,他们一直在寻找新的人才,也会乐意与你沟通。他们在接受你的邀请后,你要主动联系并询问有没有招聘的岗位。

 

(4)面试和技巧

       如果招聘者认为你适合他们的岗位,则会在LinkedIn上发消息请求发起电话面试。电话面试是与招聘者进行的,所以通常不涉及技术问题,但是我也在第一轮面试中被问过技术问题。面试内容为你熟悉的技术,之前的工作经验,并判断能否适应公司的文化等。
       如果面试效果不错,将进入第二轮技术电话面试,与技术团队成员进行交流可能会问与第一轮面试中相似的问题,但是这轮中的问题会新增一个技术测试。试的工程师会提供一个网址,上面有已经准备好的编程问题,需要你来解决。

       如果顺利通过第二轮,通常还会有第三轮面试。第三轮面试一般会在公司当面进行。和前两次面试一样,你会见到团队中的其他成员。他们会询问你的能力和经验情况,要求完成更多的技术测试。有时候可能要留下来一起吃厂!几饭,观察与团队成员的契合度。
       第三轮中会有著名的白板编程测试。如果你面试的公司有这个传统,面试者会要求你通过这种方式解决多个编程问题。我建议买一块白板提前练习,因为在白板上解决编程问题比在计算机上解决问题要难得多。

      大部分编程面试聚焦两个主题:数据结构和算法。要想顺利通过编程面试,你需要精通这两个领域。这也会帮助你成为一名更优秀的程序员。
      你还可以从面试官的角度来思考,将可能涉及的问题范围进一步缩小。有人说,软件从来无法完成,对于面试官来说也是如此。他很可能手头上有许多工作,不想花太多时问面试。他们会花宝贵的时问来白己列编程问题吗?很可能不回。他们会去搜索“编程面试问题”,挑选其中某一个提问。这就导致不断地出现同样的面试问题,因此网络上积累了诸多宝贵的资源,帮助大家练习如何回答。我强烈建议使用LeetCode网站练习,因为我发现别人在面试中问的问题,在这个网站上都可以找到答案。

 

更多学习资料:

       Medium上有位工程师写了一篇名为《ABC:  Always Be Coding))(生命不息,编程不止)的文章,文章标题就是核心思想:生命不息,编程不止。如果再做到ABL(学习不止),你的职业前途必将一片光明。在本章中,我将向大家介绍一些有价值的编程资源。

1、经典书籍
      有一些编程书籍是必读书目。《程序员修炼之道》《设计模式》《代码大全》《编译原理》,以及MIT出版社出版的《算法导论》均为程序员必读书目。另外,我强烈推荐一个免费的互动式算法入门教程,名为《Problem Solving with Data Structures andAlgorithms )),这本书比《算法导论》更加容易理解。

2、在线课堂
      在线编程课堂也是提升编程技巧的一种方式。我在http://theselftaughtprogrammer.io/courses网页中列出了值得推荐的课程。

3、骇客新闻
      骇客新闻(Hacker News是技术孵化器Y Combinator推出的一个用户新闻分享平台,网址为hops://news.ycombinator,能够帮助大家及时掌握最新的趋势和技术。

 

提升手段:

1、找到导师
      导师能够帮助你将编程能力提升一个档次。学习编程的一个困难在于,有太多你做得不够好的地方,但是你白己不知道。我前面也提到,可以通过代码审查来发现不足。导师可以和你一起做代码审查,帮助你优化编码过程,推荐优秀的书籍,教会你之前不理解的编程概念。


2、加深理解
      编程领域中有一个叫“黑盒”的概念,指的是某个你在使用,但是并不了解其工作原理的东西。刚开始编程时,对你来说一切都是黑盒。提升编程能力的一个最好的方式,就是打开碰到的每个黑盒,努力掌握其原理。有位朋友曾经跟我说,他白己的一个重大的“啊哈”时刻,就是意识到命令行本身其实就是一个程序。打开黑盒,就是我所说的加深理解。
      撰写本书加深了我对编程的理解。有一些我认为已经理解的概念,在写书时才发现无法清楚地解释给读者。    另外一种加深理解的方法,便是亲白去开发希望获得更深理解的东西。不懂版本控制?那就试着业余时问白己开发一个简易的版本控制系统。投入精力去完成此类项目是值得的,可以有效地提升你对相关话题的理解。

 

3、其他建议

      我曾在论坛上看到讨论程序员如何提升能力的帖了。获赞数最高的答案出人意料:做编程以外的事情。后来的经验告诉我,这句话是对的。读完丹尼尔甲卜伊勒的《The TalentCode》提升了我的编程能力,因为他教会了我掌握任何一个技能所需要的方法论。时刻注意编程领域之外的动态,注重吸收那些有助于编程的知识。
      我要给你的最后一个建议,是尽可能多花时问阅读其他人的代码。这也是程序员白我提升的最好办法之一。在学习过程中,记得保持写代码和读代码之问的平衡。刚开始时,阅读其他人的代码会有些困难,但是要坚持,因为你可以从其他程序员身上学到宝贵的财富。

 

更多推荐

【阅读心得】Python编程无师自通——专业程序员的养成