轻描淡写的2017

2017年,主旋律,忙。可自己还是不满意最后的结果,并不是我不知足,是因为我觉得自己还不够努力…
磕磕碰碰中,我收获了三个对我来说意义重大的词汇:自信、健康和自律。之所以对我来说很重要,是因为我还处在匮乏的状态。不一样的是,我更加深刻地体会到它们背后的意义。

从另一个角度告诉你单元测试的意义

微服务架构带来的复杂性(右边部分)已经很大程度上得到了解决,常见的解决方案是在开发团队中植入DEVOPS。比如在ThoughtWorks中的某些团队,DEVOPS成为Team不可或缺的成分。

我们把注意力放在左边部分。开发人员关注更多的是`开发`,每个服务由一个小的Team负责开发,Team正在极力往`服务自治`的方向靠拢。测试人员可能更加关注`测试`,尤其是契约测试伴随着业界对集成测试(UI测试)的痛斥声而崛起。`消费者驱动契约测试`的演讲比比皆是,我也没有例外,在某Account的技术大会上做了一次 *微服务架构下的测试应对策略* 的分享。在分享中,我赶时髦提倡用契约测试取代集成测试,但是细节中没有忽略的一个核心点:*单元测试*。这也是本文我要分享的重点。

ThoughtWorks给你不一样的入职之旅

ThoughtWorks是一家极具创造力的公司,在这里,人才是最重要的资产。如果你以应届生的身份加入TW,你将获得出国留学5周的机会(TWU培训),如果你通过社招加入TW,你会获得为期三天的TWI培训。除了TWI、TWU,公司还提供诸如NHO、Session、Workshop、Buddy/Sponsor、TL、极光计划(领导力)等数不胜数的培训。所有这些培训让你的的职业之旅变得不一样。

而更不一样的是,这次,TW北京Office联手思沃学院推出了一个Local项目人才培养计划,针对某Local项目刚刚入职的5位新人(应届生)进行`封闭式`脱产培训。旨在通过为期四周的高强度培训,帮助新人快速融入到项目中。作为Coach,我来说说它到底不一样在哪里。

受思沃学院 以学习者为中心的教学 启发,我给此次培训起名为 《以学习者为中心的项目驱动培训》,一来培训目标很明确 -- 新人更好更快地上项目实战,二来以项目为驱动力的培训是一种强有效的能力培养方式。

以学习者为中心的项目驱动培训

ThoughtWorks北京Office和思沃学院联手推出了一个Local项目人才培养计划,针对某Local项目即将接纳的5位新人(应届生)进行'封闭式'脱产培训。历时四周左右的高强 度培训,新人已经顺利加入项目。作为Coach,我想分享一些关于此次培训的经验和心得。

受思沃学院*以学习者为中心的教学* 启发,我给此次培训起名为 *以学习者为中心的项目驱动培训*,一来培训目标很明确 -- *新人更好更快地上项目实战*,二来以项目为驱动力的培训是一种强有效的能力培养方式。

XSS的那些事儿

作为一枚程序员,你一定经常看到或听到'CSRF'和'XSS',如果你的主要职责不是网络安全和系统安全,有可能你能够顺溜地喊出CSRF(Cross-site request forgery)和“畸形” XSS(Cross-site scripting)的全称,但对其背后的原理却模棱两可。

上一篇文章我们聊过CSRF那些事儿,本文一起再来聊聊XSS的那些事儿。

CSRF的那些事儿

作为一枚程序员,你一定经常看到或听到'CSRF'和'XSS',如果你的主要职责不是网络安全和系统安全,有可能你能够顺溜地喊出CSRF(Cross-site request forgery)和“畸形” XSS(Cross-site scripting)的全称,但对其背后的原理却模棱两可。

本文一起来聊聊CSRF的那些事儿,旨在提高程序员对CSRF的认识,在必要的时候知道如何防御CSRF。

微服务架构下的测试应对策略

微服务架构解决了单体应用的痛点,打破了SOA的瓶颈,同时也带来了很多的复杂性。部署运维方面,服务的部署、管理、监控。开发设计方面,服务的拆分、设计、编码、测试都将会变得复杂。幸运的是,容器化技术(比如无比流行的Docker)已经很大程度上帮助我们克服了环境的差异性,而一些容器编排工具诸如Kubernetes, Rancher, Docker-compose 提供了容器部署管理的解决方案。作为行业的领航者,ThoughtWorks也在极力倡导 开发、设计、部署、运维一体化 的DEVOPS文化理念,并通过丰富的咨询和交付成果来帮助企业研发团队更好地实施微服务架构的开发。

那么在编码测试方面,又有什么新招来保证微服务架构下系统的质量?

本文将从开发测试的视角来探讨如何在微服务架构下通过不一样的测试策略来尽可能的保证系统的质量。

一枚程序员眼中的单元测试

在外行人看来,程序员是一个成天对着电脑倒腾着代码、看着Terminal上行云流水般的打印、过着不修边幅的日子外加超负荷的码农。

在内行人看来,程序员是一个成天面对QA的'质疑'、PM的'夺命催'以及DEVs的'吐槽',扛着身心压力'苦行僧'。

在我看来,程序员应该是:手持神剑,心怀善念,胸有成竹、有理有据并且合情合理地跟QA、PM、DEV斗智斗勇的战士。

改善程序员生活质量的 3+10 习惯

程序员的工作性质决定了这个群体面临着一些问题,比如久坐引起的颈椎和腰椎疾病。身为ThoughtWorks的一名程序员,也难免长时间与电脑为舞,为了规避这些问题,自己通过长期养成的一些习惯来改善自己的工作效率和生活质量。

能够改善我们生活质量的并不是什么高深的奥秘,恰恰是一些小小的习惯。文本以黄帝内经中提到 "食饮有节、起居有常、不妄作劳" 三个方面为引子来阐述饮食、作息和运动方面的重要性,通过加强对它们的认知,配合一些良好的习惯,从而提升程序员的生活质量。

使用Raml构建Restful API

当下微服务架构的流行趋势下,一个项目或多或少被拆成多个小的服务,服务于服务之间主要采取RESTFul API进行通信。而新衍生的问题是:一个开发团队按照服务被分成多个小的Team,如何有效管理服务之间的API契约?

Raml为我们提供了解决方案。本文以一个共享图书馆的例子,针对Raml的几大特性,从API的设计、API的构建、API的测试、API的文档化到API的分享来讲解API的使用,并结合容器技术来构建一个API的基础镜像。

写给新人的一封信

最近工作和生活中发生了一些事情,正值一年毕业季,回想起自己从校园到职场的过渡,也曾有过许多迷茫与困惑。而今已经踏入软件行业四年,自己也积累了一定的经验与认知,因此想要给想要进入这个行业以及已经身处其中的新人们分享一些Tips。

新人包含在校的科班/非科班学生、半途转向培训班的培训生以及正在纠结于是否要进入软件行业的弟弟妹妹们。当然,这其中还包括一只脚已经踏进软件行业,却心存迷惘的探索者,正如2013年的我。

持续集成的容器化策略

在传统的交付过程中,开发人员和测试人员在开发测试的时候,所有的功能都正确无误,但部署到生产环境后,莫名其妙的问题就来了,这是因为开发、测试和生产环境都存在差异性,系统环境引发的问题。除此之外,生产环境通常会存在多个,而每部署一个新的环境意味着需要解决系统环境的差异性引发的问题,造成了无畏的浪费。

Docker容器的诞生,使得开发测试时的环境可以直接部署到生产环境上,有效地屏蔽了环境的差异性,解决了这个问题。本文介绍一种以Docker为载体的容器化持续集成策略。

构建可持续部署的Pipeline

CI的核心目标是快速频繁集成代码,通过一些手段(编译、代码检查、运行测试、覆盖率等)来持续地提供及时有效的反馈,可持续从何而来?前提就是这些手段都是行之有效的。

将CI的那些手段对应到每一次集成中的各个步骤,这些步骤应该是值得信赖的,比如单元测试、集成测试、E2E测试,确保它们都能够真实有效地反馈当前代码库的集成状态。试想一下,集成中单元测试步骤虽然存在,但其实没有运行任何有用的测试,亦或代码中没有添加任何测试,那么即便这一步通过了,发布的软件也是不可靠的。持续之根本取决于每一步的可靠性

ThoughtWorks,我的2016

作为一名ThoughtWorker,追求卓越,为公司和可客户创造价值始终是第一目标,当然还有一个并列的第一个目标是:提升自我,实现自身价值,而这些都胜不过 让世界变得更加美好 的伟大愿景。用一句广告语讲就是:因为你,世界便多一份美好。所以,ThoughtWorker不会忘记初心,始终坚守在追求卓越的战线上,直至趴下。

说得有点壮士断腕的感觉。这让我想起面试时郑烨问我的那个问题:当你发现你所遭遇的场景并没有你想象得那么理想时,你会用你自己的努力去改变着它,让它走向卓越吗? 虽然看似一个选择的,甚至不用动脑筋都能回答 ,可这一个字包含了太多的意义,而这一年我也深刻感受到了其中的滋味。什么滋味,这就要深入到2016年实际工作中来

手把手搭建CI

CI Dojo的第二次课程,本文将基于上次课程 CI基础 & Setup环境 搭建好的环境,通过Step by step的方式来介绍如何快速搭建一个 Jenkins CI pipeline。

CI基础 & Setup环境

Martin FLower 这样定义持续集成:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,这就意味着每天可能会发生多次集成

本文作为CI Dojo的第一次总结,将从CI基础理论介绍我们为什么需要CI以及CI的好处,最后会使用Vagrant搭建一个用于Setup Jenkins CI的环境。

ThoughtWorks中的敏捷团队建设

主导项目成功交付的核心因素还是人,以人为本 在软件交付项目团队中也是非常适用的。在ThoughtWorks,唯一相同的是每个人都有独自的个性和特长,那么这些有个性的小伙伴们是如何良好地在一个团队中工作的呢,除了大家比较强的自我管理能力之外(对TW的价值文化的认同,自我管理和自我驱动力较强),也需要有意识的搞一些团队建设工作,特别是Team Leader(PM, TL)要兼顾团队建设方面的职责,思考如何让团队更快地成长起来,以及营造更融洽的团队氛围。

我在E项目上的技术实践

我们是一个全功能团队,人人身怀敏捷开发领域的知识和技能,且有一定的经验积累,所以可以说我们天生敏捷,在开发过程中大家都能高效地分工合作。

技术栈方面,项目使用的主要技术栈是Python, Django, AngularJs, PostgresSQL, Docker。而我们DEV在进入这个项目之前,擅长的技术栈是Java, Springboot, C#, Android, jQuery。

在E项目上,我们把敏捷开发实践落实的非常到位,而本文是E项目使用的技术栈,单独抽取出来做一个简单的总结分享。

我在ThoughtWorks中的敏捷实践

敏捷开发的核心就是在一个高度协作的环境下,不断的通过反馈来进行自我调整和完善。重点强调的是 协作反馈,协作体现在团队与客户之间的协作,团队成员之间的协作。反馈则是在开发中的任何环节,包括代码质量、自动化测试、部署、项目进度、需求变更、客户验收等,而且反馈越快越好。有句土耳其谚语这么讲的:不管你走了多远,错了就要重新返回,所以我们越快得到反馈,就能越早确认自己有没有走错路。如果没有错,我们会更加充满信心。反之,及时做出调整,让浪费最小化。

本文以我在ThoughtWorks中的E项目经历为依据,覆盖了ThoughtWorks日常独立交付项目中主要的敏捷实践

Java泛型•约束和局限性

在Java中,实例化泛型类时泛型参数不能使用基本类型,如 List<int> 这是不合法的,要存储基本类型则可以利用基本类型的包装类如 List<Integer>List<Double>

本文全面介绍了Java泛型的约束和限制,对你正确使用泛型提供了良好的参考。

Java泛型•虚拟机执行泛型代码

Java虚拟机是不存在泛型类型对象的,所有的对象都属于普通类,甚至在泛型实现的早起版本中,可以将使用泛型的程序编译为在1.0虚拟机上能够运行的class文件,这个向后兼容性后期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码,是不能运行在Java5.0之前的虚拟机的,这样就导致了一些实际生产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这个问题,需要先了解一下虚拟机是怎么执行泛型代码的。

Java泛型•通配符限定

本文介绍了泛型的通配符限定,对于类库设计者理解泛型背后的原理会大有帮助。

Java泛型•认识泛型

Java从1.0版本到现在的8,中间Java5中发生了一个很重要的变化,那就是泛型机制的引入。Java5引入了泛型,主要还是为了满足在1999年指定的最早Java规范之一。经过了5年左右的时间,专家组定义了一套泛型规范,实现后通过测试投入到使用。所以说泛型是Java5以后才有的,欲知详情,继续往下看。

换个角度想,Java5引入泛型,必定是它能带来好处,否则牛气的Java工程师就要遭到吐槽了。我们来吐槽一下没有泛型的程序是怎么写的。

浅析Java对象初始化

最近交付了一个Android项目,用的是JDK7,回味了一把自己的起家手艺。项目做完了,整个过程中,我对Android开发的感触此起彼。一开始略表失望(因为一个Android开发者亲自告诉我他做Android从来不写测试),中间因为自己缺乏经验,踩了很多坑,对代码进行了多次的换血般的重构,可谓心累,不过成长也非常大,后慢慢熟悉了Android,参加了公司的面试官培训,觉得自己有必要把Android做的好一点点(包括代码结构设计,测试覆盖率)。

重拾起Java后,突然看到之前写了一篇关于Java面向对象初始化的文章,最初这篇文章是源于一道阿里巴巴的面试题,此时我再次把它整理出来,作为对Java的怀念。

文章很简短,建议放慢脚步多思考,并且能够亲自在自己的机器上运行,分析输出结果。

Learning JavaScript 翻译笔记(二)

转眼加入ThoughtWorks已经一年多了,在这片海洋里,自己还只能算一只虾兵蟹将,有很多东西要去学习。不只是简单的学习,还要系统的学习,从碎片化到体系化。对我来说,这是一个较长的持续过程。这个过程有多漫长,从这次翻译中有一些体会。

当时接手这本书的翻译,想法很简单--ES6有点意思。后来想想,自己是不是有点作,明明擅长后端,却要去翻译一本前端技术的书,常言道`No Zuo,No Die`嘛。开始翻译前,看过《漫谈翻译》这个书,对翻译有了一些旁观者的理解,心中有了一些初级章法可循。然后试翻译了几页,感觉没有那么糟糕,遂不自量力,跟另一个同事一起接手这个活。

本文继上一篇文章的翻译笔记记录。

Learning JavaScript 翻译笔记(一)

转眼加入ThoughtWorks已经一年多了,在这片海洋里,自己还只能算一只虾兵蟹将,有很多东西要去学习。不只是简单的学习,还要系统的学习,从碎片化到体系化。对我来说,这是一个较长的持续过程。这个过程有多漫长,从这次翻译中有一些体会。

当时接手这本书的翻译,想法很简单--ES6有点意思。后来想想,自己是不是有点作,明明擅长后端,却要去翻译一本前端技术的书,常言道`No Zuo,No Die`嘛。开始翻译前,看过《漫谈翻译》这个书,对翻译有了一些旁观者的理解,心中有了一些初级章法可循。然后试翻译了几页,感觉没有那么糟糕,遂不自量力,跟另一个同事一起接手这个活。

本文是一些粗略的笔记,主要记录了翻译过程中学习到的JavaScript技术点和一些好的实践指导。本文为上篇,一共有四篇,当第四篇发布的时候,意味着整本书的初译完成,而自己对后三篇也满怀期待。由于是粗略的笔记,只记录的是一些要点。为什么这么做呢?一来是担心自己翻译完之后,只专注于英文语法和中文表达去了,而ES6讲了个啥,却是两眼一抹黑;二来分享出来,了了渴望分享的欲望。

Buddy/Sponsor培训•信任的构建

Buddy,正如这个词的意思,小伙伴,好朋友。记得加入ThoughtWorks的时候,大家在公司内部的Session和微信群里喊的最多的是小伙伴。慢慢地我发觉一个现象:几乎每个人都把同事当成自己的小伙伴,大家相处很友好,互帮互助,整个氛围像个大家庭。试想一下,一个刚加入TW的新人,对TW的组织文化和做事方式充满好奇,自己的定位和发展还很茫然的时候,这时候ta被告知:Hey,你不孤单,你有一个小伙伴,ta将伴你度过半年的试用期......。陪伴,不仅仅是存在这个小伙伴,而且小伙伴要对你的成长负一定的责任,指导帮助你更快的融入到这个大家庭中来,让你成为一名合格的TWer。

Sponsor,这个词的含义有点意思了,赞助商?保证人?貌似都不是,赞助什么呢?要赞助也是公司给你赞助。保证什么?保证你不会离职?所以单从中文意义上讲,好像不是很表意,将它理解成负责人更确切一些。对于一个在ThoughtWorks顺利度过半年试用期的TWer来说,此时证明你已经是一个合格的TWer,接下来,你需要一位能够在你的TW职业生涯中给出有效指点的帮助的人,Sponsor对你今后在TW的生涯成长中负有一定的责任,帮助指引你朝自己想去的方向发展,成长为更好的自己。

Ruby on Rails 路由解析

Rails中URL的约定严格基于 RESTful 风格的。客户端的请求其实是在操作一些资源,同一资源的不同的请求动作(GET, POST, PUT, PATCH, DELETE)分别对资源进行不同的操作(CRUD)。默认的情况下,我们只需要在routes.rb文件中配置好资源,Rails会为该资源生成7种不同的路由,根据路由就可以将客户端的请求转交给服务端对应的控制器进行处理,然后做出正确的响应。Rails Route能识别这种资源式(RESTful风格)的路由以及非资源式的路由,它是客户端请求和服务端控制器的粘合剂,能将URL分发给控制器进行处理。 本文详细介绍了Rails的路由解析原理和细节。

Ruby on Rails 初次冲浪体验

Rails是一个用Ruby编写的Web应用开发框架。它的设计目标是通过预先提供开发人员最开始需要的基础设施,从而让Web应用开发更加容易。它可以让你写更少的代码来完成其他语言和框架所不能完成的工作。有过Rail开发经验的人都说它能让web应用开发变得更有趣。

本文介绍初次使用Rails的过程,涵盖了从0到1的过程,建议一步一步跟着文章进行操练。

初次做技术领导的3个陷阱

开发人员初次走进技术领导(后文简称TL)这个角色的时候都是很困难的。即便经验再丰富的开发人员,他的技能和经验也是不能自动转换成一个TL必备的技能的。事实上,如果开发人员不能很好地运用已有的技能和经验,或者不能在这个新角色中树立更多权威,一些旧有的习惯不但没有帮助,反而会带来阻碍。

这篇文章,我们一起来探索一下初次做TL时容易踏入的三个陷阱,以及他们可以做些什么来避免绕过这些陷阱。

高效技术领导的5个锦囊妙计

成为一个技术领导者(后文简称TL)对任何开发人员来讲都是一个艰难的转型,因为开发人员的经验和技能仅仅只有部分有助于他们达到对这个新角色的期望。除了简单的设计和编码,TL最重要的职责在于管理整个开发团队,这意味着TL要经常与技术人员以及非技术人员进行沟通协作。

一个开发人员花在编写良好结构的代码的时间并不能等效地转化成一些必要的技能,比如了解他人,解决冲突,以及突然需要同时处理多个他们自己并不太可能独立搞定的任务。本文分享一些初次做TL的人Tips,以帮助一个新人更好地胜任TL。

Django 数据库事务

本文是对Django 数据库事务部分的翻译。

Django REST 异常处理

本文是对Django REST框架中的异常框架中的异常处理部分的翻译。

Effective Java中文版(第2版)

Java之父的话值得我们每一个Java学习者去体会。
如果你是一个Java爱好者,并积极主动地去探索Java。
如果你想编写出优化的代码,,希望你的编码习惯被业界人士称赞。
如果你想在Java领域有所造化,如果你想为Java社区做出一点点贡献。

如果你正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码。我推荐你拿起《Effective Java中文版(第2版)》,仔细品读,反复回味。

程序员的职业素养

如果你想让自己成为专业主义者,在团队中担当责任,培养良好的职业道。
如果你希望在团队中成为一个信守承若,并善于承诺的人,掌握说
如果你希望获得在编码和测试方面的有意义的指导。
如果你希望了解专业的程序员是如何管理时间和压力。
如果你希望了解高效的项目管理和团队协作。
如果你希望成为一名具备良好职业素养的程序员,并渴望得到有价值的启发(这是重点)。

如果你有以上的意愿,我建议你拿起 《程序员的职业素养》,好好的品读并仔细的思考,你也可以重复读此书,每一次都会有不同的体会

ThoughtWorks,我的2015

2015年3月26日,我正式加入ThoughtWorks,这一天,我内心充满了喜悦,也多了几分压力,我的ThoughtWorks之旅在就我憧憬了一年后真的开始了。那么2015年3月26日之前,我在哪里呢?一笔可以带过:和朋友创业失败,过了本命年的春节后,我再次来到ThoughtWorks西安办公室,招待我的还是美丽及气质不凡的HR唐丽娟。就这样,一个星期过去了,在2015年3月26日那天,我跟ThoughtWorks签了终身合同。重要的事情说三遍,重要的日子也出现了三遍。

一年过去了,2015,我在ThoughtWorks经历了不一样的一年,感恩!