Python大厂资深工程师,技术之路分享

2020-07-21 04:24:08 来源: 阅读:-

本篇内容整理于胡阳老师(the5fire)直播分享——《Python Web开发之路》,围绕入门、成长、进阶三方面,从项目技巧讲到技术思维,从团队视野讲到视野规划,全面解读了Python Web开发者的进阶之旅。希望这个分享能帮你走出职业困境!

Python大厂资深工程师,技术之路分享

视频加载中...

作者简介

胡阳

网名the5fire,前搜狐资深开发工程师,现任知乎资深开发工程师,负责部分业务的后端开发和团队管理。同时也是腾讯云最具价值专家(TVP)。

具有10年编程经验和写博客经验,喜欢通过代码来构建一些有价值的东西,也爱好记录和分享自己的经验。

2011年从Java转到Python后,便不可自拔,主要熟悉的Web框架是Django和Tornado。赞叹于Python的开发效率,欣赏Django完备的功能点对实际项目开发中程序员生产力的提升。

问答内容分享

Q1:

现状:当下人工智能落地困难,我司也是,业务上对Python和Web要求不高,不停的处理琐碎的事情让个人成长变得缓慢。

问题:

1. 相比传统的Java Web开发和新兴起Go服务端开发,Python Web未来在哪?

2. 除Python技能外,技术生涯还应规划和实践那些?

A1:

人工智能的这个事情其实我没有做过,从Python Web开发上来说,首先需要定义的是:什么是琐碎的事情?

比如说,你开发一个新闻的网站,他有前台和后台,前台是纯接口的方式,后台是后端渲染的模式。一开始你会觉得写太久后台了,想去写前台。刚开始写前台,你会觉得很新鲜,这种模式跟之前做的不一样,但时间长了,你会发现这东西也是很琐碎的,每天都在重复做类似的需求,你可能做不到一年,你就会变得特别烦这事。很多人都会遇到类似问题,这个时候其实我的建议是什么?往上看或者往下看。

往上看是指?谁把这些琐碎的事情给你,看他为什么要给你这些琐碎的事,这个事情能不能换另外一种做法去做。你要去跟他沟通,要了解他的目的是什么。如果你从源头上把这些事情给hold住,OK,这些琐碎的事情,慢慢的你就可以不做了,可以交给其他人来做,比如说交给一个实习生。 并不是说实习生就应该去做琐碎的事情,而是说这些事情可能和他在学校做的实验室项目是有区别,他也会觉得特别新鲜,会认为很有挑战,这其实是个双赢的结果。

往下看是指?它算是基础,就是你始终在做同样一个东西,你是不是能把这个东西抽象出来?我拿Django来讲,一帮人在做一个新闻网站,要求有个后台,编辑老师提出十几个功能需求,然后你把它抽出来,搞一个框架就好了。你把东西抽出来,选一个你更擅长的工具,让他来帮你更自动化的解决这些问题。

Python和Go的兴起,Python的未来在哪?这个问题其实我们当时在线下讨论过,对于Django或Python来讲,想要快速上线一个东西,很显然Python是有竞争力的。这个东西可以支撑你到一定级别,当你达到足够量级,且有了足够的钱,你会发现语言已经不能够支撑你的业务量了。但大部分产品是不存在的,只要花钱就好了。这个时候你会考虑换技术栈,当然换技术栈成本是很高的。所以,Python对于快速开发来说,还是比较有效。

要了解你的技术擅长点,无论你用Go还是Python,比如对Python来说你要的是足够快的开发效率,尤其是发展型公司会让你的节奏变得更快,生产迭代速度也会变快,正常当你的性能不是瓶颈的时候,其实它是一个非常合适的技术栈。

Python技能之外的技术声音还要实现哪些?其实对于Python来说,它只是一个点,你把Python了解足够细之后,这变成一条线了,但它还不是一个面。对于Python来说,我自己经常问到的一个问题:我们把一个请求从一个用户端发起到服务端,它所经历的所有的链路,描述一下这链路上所经历的所有的系统组件,除了Python之外的组件,其实你都应该去了解,因为这个决定了你是否能够知道用户的流量是怎么达到你的服务器上,以及你的开发机的代码是怎么部署到生产服务器上的。这其实是Python之外,你需要掌握的。

另外就是这个是技术层面的规划,一开始你的规划应该是着重在你把这个技术能够了解的足够详细,但关键点在于你要了解当下的核心点,比如当前你想了解Python的入门,你就跑去看Linux,去看其他的,这显然不划算。因为毕竟你面试公司或目前公司让你用的还是Python。所以这个时候其实以Python为主,其他的为辅就好了。然后其他的就是我刚才说的,你除了技术之外,你要更关注一下整个团队整个公司的业务方向。

Q2:

问题:前后端分离对Python Web 开发有什么样的影响?

A2:

其实没有影响。这个问题很奇怪,就是很多人会问,现在大家已经都在做前后端分离了,你还在用渲染页面来做,这个是不是太Low了点?

大家一定要意识到一件事情,就是本质上对前端来说,我说的前后端分离,其实它只是前端跑在浏览器里面,然后后端通过接口吐出去,对吧?本质上,浏览器接收到的是你吐出的数据,你吐的是JS还是HTML,其实都一样的。对于后端来说,你需要把这个东西渲染成或序列化成对应的格式,给返回回去。

只是你有一个系统,这个系统吐出来是JS还是吐出来是HTML,仅此而已。只是说唯一的不同就是可能需要你去维护。如果是后端渲染的话,可能需要你去维护模板,当然,这些东西的维护也不一定是要在后端来维护的。比如,你可以去把这些东西放到数据库里,通过另外的方式去把他加载过来,其实都是OK的,所以说没什么大的影响。对于你学习Python Web开发来说是一样的,但还是建议大家能够有基础的前端能力,你每天都在上网,如果两个网页是怎么构成的都不知道,也说不过去。

Q3:

问题:我想问问,现在互联网场景下,用户需要更精准的访问到自己喜欢的信息,平台才能受益,那么,做一个入门级的推荐系统,需要哪些知识?

A3:

关于精准的系统推荐,我不专业,推荐你去看项亮老师的《推荐系统实践》,据说这本书很好。

Q4:

问题:对于一个用Django开发的基本雏形网站,如何达到相对稳健,处理高并发等类似问题?

A4:

首先你得有高并发,开个玩笑。

就是你要清楚了解到,哪怕你的网站每天PV只是1,你也要去关注这个人访问页面的响应时间是多少。我们在做访问优化的时候,或者在处理高并发的时候,最关键的问题在于我们要去把每个节点它的响应时间变得足够得短。比如,用户访问到你这个页面的时候,它通过浏览器的Network请求看到返回的响应时间是2s。对,显示时间有点慢,那么这2秒是怎么产生的,你必须要知道。比如,请求发到后端,后端再访问到NGX的耗时是多少?你要能看,并且你要知道怎么看。

然后,之后你要知道你的函数,比如拿Django来说,配置好URL,配置好对应的View,这个View里面可能做了比如三次的通过Model查询数据库。View的响应时间是多少?从这个请求通过你的URL,dispatch就是就分发到你的View这个函数里面之后,一共耗费了多少时间?每一次你的Model的操作,它耗费的时间是多少。你要把这个东西全部都了解到,你才知道这东西在哪。但前提是你也要了解,比如,对于Mysql,一条SQL查询的响应时间在多少是合理的。比如说这个SQL的响应时间超过了10毫秒超过20毫秒,它是不是正常的?比如,Redis的响应时间超过了5毫秒,是不是正常的?就是你要清楚的了解你每一个点它所需要消耗的时间,这个时间积累起来就是你所要的这种高并发。

Q5:

问题:你好,胡阳老师。最近在看你的那本书,书里面最后部署的环节我卡在那里面了感觉你讲的很浅,代码那块有点看不懂。请问,你针对于那部分学习吸收有什么好的建议?

A5:

关于这个问题,我建议去群里聊,我有QQ群,其实很多人会遇到类似的问题。这个看不懂,第一个点就是你可以在群里交流,或者直接问我,第二个点就是你去把相关的东西全部死磕下来,比如,Fabric去部署,你不知道他怎么部署,或者你不知道Fabric怎么用,那你去看下Fabric怎么用。

然后,比如Linux配置,你不知道,那你去看下Linux配置,你要知道我们现在用的这套流程里面涉及到的知识点或技术点有哪些,之后这些知识会帮助你把事情做好。我建议就是你去死磕这些点,对于你去学习一个新的东西的时候,是很关键的。然后,整体的话,就会有一个比较好的状态,就是说白了其实还是对这个东西比较陌生。

其实,对于问题5还可以具体问题具体沟通,我觉得现在看书的一个好处,相较以前,你遇到一块特别的晦涩难懂的,你发现你联系不到作者,你也没有一个群去沟通这些东西。但现在是个挺好的时代,你可以很快速地跟各种人建立连接,可以快速的交流,包括我们今天的分享,其实也是一样。

Q6:

现状:人工智能的大火,导致很大一部分人把它当成了一个新兴的领域,其实不是;当前谈到人工智能侧重于AlphaGo自动驾驶等运用的深度学习。

问题:

1. 老师您认为人工智能目前的发展中,难以突破的难点是什么?

2. 各行业应该如何运用AI技术?这类技术又如何改变生产力?

3. Python Web相对于其他技术的实用性与发展?

A6:

问题6,这个有点深了。因为我不是这个行业的从业者,我也很难去判断。所以单纯对于Python Web开发来说,无论是什么样的行业,什么样的先进的技术,你都需要有一套系统来管理这些数据。本质上来说,程序员在做的事情是什么呢?我们不生产数据,我们只是数据的搬运工,我们做的事情就是去搬运数据,去管理数据。

比如,我们做一个后台,是为了帮助运营或者编辑,帮助他们去管理这些内容。这些内容是数据,但是这些数据不归我们管,是他们通过我们的系统产生的数据。那么,我们不产数据,我们只是在管理这些数据,对吧?比如,新闻网站,运营和编辑产生了内容之后,用户去消费了,我们只是通过我们构建网站的这套系统,去把对应的数据呈现给用户。OK,那用户可以看到了。所以一样的,其实无论在哪个行业,无论多么热门的领域,他最终一定需要一个东西,或者需要一个系统去把这些数据给展示出来,或者去控制它,要做的事情。

Q7:

问题:Python Web开发的前景怎么样?能和Java的SSM抗衡吗?

A7:

我简单聊下,现在的话,Java的那套东西已经挺轻了,语言层次及语言的这种特点,也决定了它的开发效率,所以,相较Java,其实在Python Web开发上还是有优势的。只不过,我们要从整体的市场环境上来说,Java的岗位显然是更多的,因为他用的多,然后整个市场环境会比较发达,市场环境发达是指学习的人多,然后做这种叫培训的人多。然后用Java人多,然后产生了这样一个循环。

所以其实抗衡的话,这个东西倒谈不上,只是说它有它自己的这种适应的场景和适应的这种空间。

Q8:

问题:什么水平可以去应聘实习生,或者说应届生达到什么水平可以去找工作?

A8:

事实上,我们在面试的时候,如果真的很缺人,我们更多的考虑的点,这个人能不能干活,如果不能干活,那聊其他的没有用,对吧?所以能干活,这是底线。

什么情况下是能干活?你自己去假想一个场景,比如,你现在就要去写一个博客系统,有什么样的需求?你能不能在半个月之内,把这个博客写完,并且部署到线上,这是个很实际的问题。如果你能把这东西确实这么搞出来了,那是你具备了能干活的能力。

第二点考察就是学习能力怎么样?

我们会问,你用这个语言多久了?比如,之前我面试用Python特别久的人,他可能用的Python的时间比我还要久。假设他用了5年,但在聊的时候发现这个人对Python的掌握也就幼儿园的水平,问深的东西就完全不知道了。这种场景下你可以判断它在Python上或者在语言上的学习能力,当然也可能跟他没有投入时间有关系,但他既然还是要找Python的岗,掌握成这个样子,显然是因为他学习能力不够。没有学,其实也是学习能力的一种。

还有另外的点的话,说点实际的,对工作几年的人来说,我们会考察他的整体的系统设计能力,会考察他的项目经验,会考察他对业务的描述。对这一点是很重要的,你是不是能够特别清楚的描述你之前做过的项目,它的业务是什么?如果你不能把这个业务描述的很清楚,我很难相信你写的代码能够完全匹配他的业务场景,对吧?这是很重要一点。

对于应届生,因为毕竟没有工作经验,考得最多的点就是知识层面的东西,第一部分知识,第二部分经验,比如,对于Python知识点的掌握或者了解,对于MySQL对于Redis,然后对于计算机的程序设计的理解,对于Linux操作系统的一些理解,对于数据结构和算法的理解,这个东西对应届生来说是必备的。

如果你参加过一次或几次校招的话,你其实会知道,这些东西基本上都在校招的笔试题里面已经呈现了。

Q9:

问题:Python和Java的微服务怎么结合,有什么最佳实践?

A9:

其实对于我们现在场景来说,基本上都是微服务的方式,就是通过RPC来调用,其实没有什么最佳实践,在这种异构的系统里,两个不一样的语言之间,通过接口来打交道,这是一个很实际的场景。

Q10:

问题:请问老师对于计算机专业大学生关于就业的技能学习和学习路程,有没有什么建议?

A10:

其实刚才回答实习生找工作的时候,已经简单聊过了。首先,你确定的方向是什么?方向其实没有太大的差别,比如,我做Python有前途还是做Java有前途?你可以去招聘网站去看,现在的岗位哪个多,对应的岗位的工资是什么?你去搜,比如,Java工程师,Java初级工程师,Java高级工程师,同样的你去搜Python或其他任何语言,看他们要求,看他们的待遇是什么样子的。这种情况下,你确定你的方向之后,跟刚才说的基础的东西是一样的。

然后就是,比如,关于语言掌握的熟练程度,然后关于框架的掌握程度,关于整个Web系统的熟悉程度,这是上层东西,这个东西就是跟语言有一定关系了,所以你的路程里面其实就包含了这东西从底层到上面的东西。但最终你要知道你的目标是啥,你的目标其实决定了你的方向,方向定好了效率会比较高。

最怕的就是很多人反复在纠结,他写了一年Java之后,然后就去做其他的了。当然,我也是这个例子,但这个前提在于你能不能有一个更有效率的提升。当你找到感兴趣这个点之后,很多时候因为你大学里面学的是Java,所以你去找了个Java的工作,这种情况下,其实有一定被动的成分在里面。当你去主动的选择了一个语言之后,其实你要至少在前几年,你要把这个体系构建的足够好。

对,其实这就是我建议。

Q11:

问题:什么是初级工程师?什么是高级工程师?什么中级工程师?这个是很多人在困惑的一个问题,就是包括我之前在招聘的时候,我说我们招聘中高级工程师,有人就会问什么是中高级工程师?这个是这是很难界定的,它没有标准。

A11:

但对我来说,我可以分享一些我个人的观点,初级工程师是什么?就是你能干活了,并且干的还不错。我可以把这活交给你,你来做,这就是初级工程师。

中级工程师是什么?你把这个事情可以做得足够好,一定程度上也能影响其他人。比如,无论是你去帮其他人去解决技术问题,还是说去带着一个人来做你现在做的项目,这个时候你就会有一种进阶的状态了。

然后,高级工程师在团队中什么样呢?大家有问题都会去找他,这是一个特别明显的一个状况。有问题你就去找他,找他之后就能解决,这就是高级工程师存在意义。更重要的是,高级工程师他关注的不再是一个具体的功能点或一个具体的系统,它关注的更多的是整个系统的构建。然后它能解决整套技术栈上遇到的任何的问题,且对技术栈足够熟悉,另外,他也能够去帮助底层的人去成长,因为他知道怎么把初级工程师给带起来。其实这是初中高级的一个简单的区分。

或者我们更粗暴一点,一个初级工程师,你很放心地去让他做一个新的功能点,但是你要他独自去做一个大项目的话是不放心。中级工程师你可以把一个项目交给他做,他可以完成得比较好。当你想让他负责更大的业务的时候,你会考虑一下要不要给高级工程师,其实就是你可以很放心的把这个项目交给他,或者把多个项目交给他,他可以帮你搞得特别好。对吧?基本上高级工程师都会去带团队。

Q12:

问题:Django怎么配置数据库读写分离?

A12:

Settings database 里可以配置多个数据库,然后自定义 router 就好了:

https://docs.djangoproject.com/en/2.2/topics/db/multi-db/#topics-db-multi-db-routing

——

OK,今天的分享我们就到这,感谢大家能够花时间来听我的分享,尤其这种语音的分享。

其实在群里我们还是可以多交流,个人的观点只是仅供参考。因为很多不同的经历决定了你对现在事物的看法是不一样的,所以大家可以在参考我的一些观点的时候,去参考其他的一些人的分享,这种的好处就是让你看到的事务会更加具体,更全面。其实这也是我们说,你看技术的时候,除了看这个技术点之外,你要还做横向对比,对吧?比如说你用Python,你为什么要用?为什么不用Go?为什么不用Java?当你对判断了解足够多之后,你要去这么想一下。

OK,我们今天就到这里,还是感谢大家!

拓展资料:讲师胡阳著作——《Django企业开发实战:高效Python Web框架指南》

Python大厂资深工程师,技术之路分享

胡阳 著

本书以从零开发一个博客系统为例,介绍Django在日常工作中的应用。

本书共分为四部分。第一部分介绍编码之前的准备工作,包括需求分析、Web开发基础以及选型时Demo的练习。第二部分开始正式实现需求,介绍了环境配置、编码规范以及合理的项目结构划分。通过对Django各部分(Model、Form、admin、View)的介绍和使用,完成了一个基础的博客系统。第三部分在前面的基础上介绍Django第三方插件的使用,通过引入这些插件进一步增强我们的系统。最后一部分也是正式工作中必不可少的部分,包含调试代码、优化系统、压力测试以及自动化等内容。

本书适合Python Web开发人员阅读。



推荐阅读:a9x