美文网首页
程序员的自我修养(二)

程序员的自我修养(二)

作者: 我是一个努力干活还不粘人的小妖 | 来源:发表于2020-03-21 14:42 被阅读0次

    第二章  谈实践与认知

    程序员思维:

    •长期不间断地编程实践。

    •持续地学习与借鉴(参考)。

    •学会反思,并像专家一样思考。

    新一代的程序员不仅需要具备很强的编程能力,同时还需要具备从设计、运营、测试等各种不同角度去进行分析和判断的能力。

    突破程序思维

    多年的开发工作,使程序员们不自觉地首先想到如何用技术手段去解决问题,然而,真正优秀的程序员一定善于透过技术发现问题的本质

    全栈工程师如何快速构建一个Web应用

    网站开发的各个重要阶段(网站定位、功能设定、设计、架构、开发、部署、性能调优、数据统计、开发工具)

    网站定位与功能设定

    快速搭建出一个具备核心功能的应用原型——MVP(Most Viable Product,最小化可行产品),来验证自己的业务模型,然后再根据用户的需求和反馈来不断进行改进。

    概要设计、业务建模,信息架构

    对不同纬度和粒度的信息进行抽象、规划、设计,从而支撑整个网站的信息体系

    优秀的架构和设计思想

    领域驱动设计(DDD)、面向服务的设计(SOA),Oracle的基于数据建模驱动的设计,再到最新的微服务架构设计,等等

    ui设计:现代网站设计工具(比如Blocs)

    TLS对数据的传输进行加密处理。

    使用YSlow等工具是一个不错的选择,它能告诉你网站加载缓慢的原因,并给出优化的建议。

    下面是一些常见的优化方法。

    •合并压缩静态文件:将JavaScript、CSS文件进行压缩(去掉不必要的空格、换行和注释)与合并(将多个CSS或JavaScript文件合并成一个文件),并使用GZIP进行压缩,可以提高网站的加载速度。

    •使用前端镜像库:对于网站中用到的第三方字体和前端代码库,我通过360和百度的前端镜像站点来获取,这样可以降低网站本身的流量开销,也可以提高网站的整体加载速度。

    •利用云存储和CDN进行加速:技匠社的资源分享具备图片上传功能,而图片是最占带宽的,3M的带宽根本支持不了几个用户的同时访问。因此,我选择使用了七牛云,我将用户上传的图片通过七牛云的API传到七云存储空间内,并直接利用它的CDN对这些静态资源进行加速,这样一来网站的图片及那些静态文件(我们将那些不会频繁修改的JavaScript、CSS等都放到了CDN上)就不会占用阿里云的带宽了。另外,不得不说七牛云的价格对于个人用户或初创企业来说还是比较优惠的,比如,10GB空间以内的存储都是免费的。

    网站上线后,你仍然需要对网站的访问量、用户情况进行持续的统计和分析。

    能够快速构建出一个Web应用或APP是全栈工程师的核心竞争力,这也是为什么那么多初创公司都在寻找全栈工程师的原因。

    到底需要具备怎样的技能才能成为一名全栈工程呢?下面这张图来自Medium,作者将软件开发所涉及的各个方面分为层,又将每个层所包含的主要技术作为组件,制作了这张全栈技术图。

    你应该将自己的精力聚焦在关键开发技能,以及一些必须掌握的附加技能上。

    (1)关键开发技能(硬实力)

    •Git/GitHub

    •至少一门编程语言——你需要精通至少一门编程语言,如Java 、PHP、Swift、C#、Python、Ruby、Perl等,因为你的大多数核心业务处理都需要用这门语言来写。你既要掌握这门语言的语法,又需要非常熟悉如何基于这门语言进行项目的架构、设计、实现及测试。如果你选择的是Java,那么你就需要掌握面向对象的设计和开发、设计模式的应用、基于J2EE各个组件的开发,等等。

    •运用开发框架和第三方库——流行的开发语言,一般都伴有出色的开发框架

    •前端技术——之所以将前端技术独立出来,作为一项关键技术,是因为它在今天的项目和产品的研发过程中正变得越来越重要。一个产品除了实现所需的功能之外,是否好用(用户体验)也正在成为评判一个产品是否成功的重要标准。

    •数据库与缓存——任何产品或项目都需要一个数据库来存储数据。作为全栈工程师,你也需要至少掌握一到两种数据库,并知道怎样与数据库进行交互。目前流行的数据库主要包括MySQL、MongoDB、Redis、Oracle、SQL Server等。MongoDB作为文档型数据库,在互联网产品中正被越来越多地使用,对于规模稍大一些的项目,我仍推荐使用MySQL或商用的Oracle作为后端数据库。而Redis这样的内存数据库则可以用于缓存,以提升系统的性能。

    •基本设计能力

    你需要掌握那些最基本的UI设计原则,如色彩的搭配,基本的排版,并具备良好的审美能力和一些基本UI设计能力,这样你做的产品就不会太差了。

    (2)附加技能(软实力)

    •沟通

    •问题解决能力

    •时间管理

    •好奇心

    •领导力

    管理者需要理解你的团队成员的长处与不足,并知道如何以服务的态度使团队获得最大化的产出。

    优秀的全栈工程师需要走出去

    •参加技术大会——InfoQ、CSDN、GITC、优设、TED等网站都会定期举办各类技术大会

    •做公开演讲

    •个人博客

    •参加线下活动

    前端开发的命令行工具

    •你还可以使用Grunt、Gulp这类基于任务的处理工具,进行从代码、测试到部署的整套自动化流程。

    一名普通程序员,你只需要从熟悉那些最常用的基本命令开始,比如,ls、cd、pwd、cp等,反复尝试,你很快会习惯使用它们,然后就可以更进一步,去写一些自动化脚本来帮助你完成一些工作。

    接手去重构一个新的系统时,带来以下问题。

    •自动化程度低下

    •缺少有效的包依赖与版本管控

    •缺少自动化测试覆盖

    •不利于团队构建

    系统重构的第一步便是引入构建工具或重写构建脚本。

    •引入构建工具:对于后端Java程序来说,我最常使用的便是Groovy,目前也开始尝试使用Gradle。而对于前端来说Grunt或更新的Gulp都是不错的选择。

    •第三方包依赖与版本管理:通过定义全局属性文件的方式,如定义系统的版本号、名称等信息,并在构建脚本中明确定义引入第三方包的依赖关系与使用的版本,从而使整个开发团队都能使用统一且标准的开发环境。

    •实现自动化:通过定义不同的Target(注:Groovy中的一个任务称为Target),来实现不同的目标。比如,增量编译与本地部署、自动化测试、打全量版本包,等等。总之,将一切需要手工完成的任务,都利用工具去帮你完成。

    •写入开发手册:将构建工具的使用,不同Target针对的不同应用场景写入开发手册,能够有效降低新人的学习成本,并使整个团队的开发效率得到提升。

    让自动化测试成为重构的保障

    我们重构的目的往往是去解决系统的某些痛点,这些痛点也往往是系统的核心功能,因此,在你改动代码之前,需要详细分析修改可能造成的关联影响。下面是我在做关键功能重构时所采用的步骤:

    •详细Review该功能的需求。

    •针对需求,完善自动化单元测试案例。

    •将这部分单元测试的执行引入到每次自动化构建中。

    在大部分我重构过的项目中,起初自动化单元测试都是缺失的。由于对核心功能的重构,往往涉及大量代码的反复修改,因此,通过引入单元测试,可以非常有效地避免因重构造成的关联影响。而通过重构完善自动化测试,在我看来也是一个很好的重构实践,它将为我们未来的持续重构打下良好的基础。

    代码级的持续重构

    虽然我们一开始总是能够确保代码的质量,但不可否认,我们的代码会随着时间的推移变得越来越糟。这其中可能包括:

    •重复的代码(它们可能存在于同一个类或不同类中)。

    •不一致或没有标识性的对象、变量或方法命名。

    •过长的代码段。

    •让人费解的布尔表达式。

    •过于复杂的逻辑判断。

    •对象错误地暴露其内部状态。

    •遭废弃但没有删除的类或方法。

    对于上面这些代码中的坏味道,你应该一有机会就尝试去重构它们。但要记住,你不应该操之过急,想着一下子把所有问题都一起解决。你需要先识别这些问题,然后分步骤地逐步去解决,而每次重构时你都需要充分识别可能造成的关联影响。如果你已经为你的代码写了单元测试,那你的重构将会有很好的测试保证。如果没有,那么你也可以尽可能找人帮你Review修改的代码,因为不同的人来看你所修改的代码总是能发现一些你没有意识到的东西。

    避免过度设计:过度设计源于系统设计者没有理解用户的真正需求,而将自认为有必要的功能附加于系统之上。前面提到的可配置、个性化等就是那些最典型的例子。要避免过度设计其实也很简单,要做到多看(看那些优秀的系统是如何设计类似功能的),多想(站在用户的角度去想他们所提需求背后真正的痛点和问题是什么),多做(不要只停留在需求文档上,应做出能够验证需求的功能原型然后不断确认和改进),多说(在每一个阶段都与用户保持有效的沟通)。

    效率类工具

    Ulysses 2.0(http://www.ulyssesapp.com/) mac系统

    可以将一篇文章分成多个小节,然后在编辑器中仅针对这个小节来进行写作,这能让我更好地保持专注。另外,它支持多种文件格式的导出,如HTML、PDF、Word等,这样我可以将我的文章非常方便地发布到不同的平台上。

    相关文章

      网友评论

          本文标题:程序员的自我修养(二)

          本文链接:https://www.haomeiwen.com/subject/ztiyyhtx.html