Blog | Phodal - A Growth Engineerhttp://www.phodal.com/blog/2021-01-19T09:38:57.436179+00:00Blog写个取代自己的工具:Coco —— 自动化分析与建议2021-01-19T09:37:31+00:002021-01-19T09:38:57.436179+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/coco-analysis/作为一个资深的软件工程师,我经常遇到其他/她开发人员大量的重复问题。过去只靠写博客,现在,我有了四种方式来解决:
- 博客。我的博客 phodal.com 上有 850+ 的博客
- 工具。创造开源工具解决重复性问题,如:ADR、Lemonj、Coca、Clij
- 开源电子书。系统性的归纳某一个领域相关实践和模式,如:《Serverless 应用架构》
- 知识平台。结合工具和电子书,如 DevOps 知识平台:Ledge
即使如此,依旧没有解决一个问题:我需要人力来分析项目、再抛出这些链接。于是,过去我一直就在想:**能否做一个工具来取代自己?** 当然了,我的真实意思不是:取代我自己,而是取代我做的那些重复性活动。(PS:等写完之后,再写一个自动化写 PPT 的工具,就完美了。)
所以,我开始编写一个新的工具,一个关于对代码进行自动化分析与建议的工具。
## Coco:自动化分析与建议工具
在 Coco 的 README ( [https://github.com/phodal/coco](https://github.com/phodal/coco) )里,可以看到现在规划的 1.0 的相关的 Todo 列表。从某种意义上来说,这是一个 AI 工具(专家系统),它依赖于资深工程师的大量的经验。它的难度主要在于:
- 工具的 MVP 版本。验证工具在技术上是可行的(PS:从我的角度来看,它并不存在问题)
- 持续性的经验输入。持续完善整个工具的建议体系和架构
- 上下游生态完善。获取上下游工具相关的资料和数据(PS:如 DevOps、云原生相关)
- 避免功能膨胀。必要的情况下,通过插件的方式来扩展功能
### Coco 与 Coca 的关系
[Coca](https://github.com/phodal/coca) 是笔者(@phodal)写的一个用于系统重构、系统迁移和系统分析的瑞士军刀。它可以分析代码中的测试坏味道、模块化分析、行数统计、分析调用与依赖、Git 分析以及自动化重构等。
Coco 这个名字的来源是**椰子鸡**,正如 Coca 项目([https://github.com/phodal/coca](https://github.com/phodal/coca) )的来源是 Coca Cola,只是维度上由喝的变成吃的而已。Coco 是 Coca 的姊妹工具,与 Coca 工具是相互补充。
### Coco:自动化分析与建议工具
Coco 要实现的主要功能是:
- 分析。对项目进行全面化的分析,如 Git 历史、模块化分析、框架使用等
- 报告。以可视化和文档的形式输出项目的总览信息(结合 D3 可视化的形式)
- 建议。针对于项目中的问题,进行自动化的建议
- 成熟度。(TBC,待定)
从里程碑来说,我们所要做的功能特别多。而结合 Coca 和 DevOps 知识平台 Ledge 在开源社区经受了一年多的洗礼,它们受到了越来越多的开发者的喜爱。与此同时,在这一年多的时间里,我也将自己的经验不断也输入到了项目中。
与此同时,我们将先创建一个组织:**Inherd**,作为这一系列工具的核心团队。
### Coco 技术栈
作为一个 CLI 工具,我本该选取 Golang 作为主要技术栈的。但是,经常与 Ledge 的开发者们讨论一番后,大家决定使用 Rust(虽然大部分人都没有经验)作为主要语言。与此同时,作为一个已经使用了一年的 Rust 语言的开发者,我觉得这并不是太大的难题。与此同时,这个工具未来也将在浏览器上运行,Rust 的 Web Assembly 支持比几大主流语言友好。
除了 Rust 之外,我们还需要可视化相关的报告等,为此我们还需要前端相关技术栈的开发,如 D3.js。当然了,能结合 Web Assembly + D3.js + 其它框架也是一个不错选项。
### Coco 进度
对于写一个工具来说,最难的是开个头,随后就是补充功能和重构了,谁都能做。
当前主要进展:
- 使用 `libgit2` 实现对 Git 相关的分析中。
- 集成 Tokei 实现 CLOC 相关的行数统计。
- 集成 Scie 的框架检测功能,对技术栈进行可视化
以下主要模块还未开始:
- 模块化分析
- 可视化报告
- 标签生成(AI,分词)
- 改进建议
- 工具建议
还有其它诸如案例学习等等,详细见项目的 README。
## 其它
欢迎加入我们:https://github.com/phodal/coco远程工作一周,我们使用这些工具2020-02-16T09:25:52+00:002020-02-16T09:26:37.372986+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/rework-agile-team-tools/过去的一个月里,那些可爱的人还在辛苦的工作中,没有假期,有的人可能已经复工了两周 —— 比如归属于北京 ThoughtWorks 的同事,还有的人可能复工了一周 —— 比如归属于上海 ThoughtWorks,还有的还没复工 —— 比如归属于武汉 ThoughtWorks 的同事。
对于有些人来说,这篇文章可能有些晚。在这几周里,我度过一个充实的 “假期”,晒太阳打苍蝇的热情 —— 不去想工作上的事,减少写代码的时间,只保持最低的活跃度。
不过,在这期间里仍然还是开了一些会,不过多数时候我都是在划水。所以,让我们先从开会的工具讲起。
## 会议工具:Zoom
ThoughtWorks 是一家**全球**软件咨询公司,这也决定了我们公司的 TechOps 们选择工具的时候,会从国际化来考虑。但是,这并非是强制的,因为大清自有国情在此。
在过去,我们使用 Fuze 作为我们的官方会议工具。不过,作为一个技术人员,刚入行的时候和今天相比,当时我并没有太多的会议,我对这个工具没有太多的印象。而因为它的语音质量差,我们在 17 年的时候,选择了使用 Zoom 作为我们的官方工具。为什么说是官方呢,因为除了 Zoom、Fuze,我们还会视情况使用 Skype、WeChat、Goto-Meeting、Hipchat、Lync 等工具来进行聊天。
**Skype**。在我的第一个项目里,Skype 是我们的首选会议工具和 IM 工具。不论是在国内,还是在国际,它都非常可靠,功能也相当的丰富。我有一段时间认识它就是官方的工具,但是并非如此,我没有去细究过原因。可能是因为过去的 by Microsoft 和今天的 by Microsoft 不是同一个吧,笑。
**Zoom**。在各方面上的素质都还是相当不错的,除了据说是 300 人数上限的限制。由于 ThoughtWorks 的多地办公性质,我们依赖于 Zoom 的会议录制功能。当我们做技术分享的时候,它可以录制下来,提供给其他/她没有时间参加会议的同事讨论。它还可以生成会议音频字幕(不过好像没有看到中文支持的)。
我讨厌微信作为会议工具,我不想多提及个人的微信。
## 上网工具
作为一家外企,我们的访问外网的工具是合法的。但是出于内部安全、文章安全和外部安全的原因,这里我就不展开讨论了。
但是呢,如果你们的网络受限,只能远程访问。那么,你们还需要有一个合适的内部工具。
## 日程工具:Google Calendar
由于,我们使用的是 Google Suite 作为内部的联系系统,所以当我们需要一个会议时,便需要在 Google Calendar 上订下会议时间,并写明一些会议细节和对应的 Zoom IM,然后发出这个日历即可。比如:
而为了能在手机上或者是电脑上收到这个 Google Calendar,我们需要一些额外的工具。
**macOS 的互联网账号(Internet Accounts)**。由于自带上网功能,所以我添加了 Google 的账号,然后开启了除了邮件以外的功能。这样只要我国际在线的时候,我就可以在电脑上收到 Calendar。
**手机 Outlook**。同理的,还可以在手机上做类似的事,但是因为种种原因。我并不想在我的手机或者 iPad 上的 Calendar 看到工作的事情,所以我在手机上使用 Outlook。Outlook 自带国际上网功能,可以让你在手机上接收到 Google 的邮件,同时还有同步访问 Google Calendar。
顺便一提,除了 Chrome 浏览器访问 Gmail,我没有用自带的邮件客户端工具或者 Outlook,它除了干扰我写代码之外,一无事处。
## IM 工具:Hangouts Chat + Wechat
尽管 Hangouts Chat 是官方的工具,但是在国内的时候,我们基本不使用这个工具。
在和国外项目交流的时候,我们使用 Slack,作为一个国际化的工具,它唯一的问题是,它只能在公司内部使用。也正是因为这个特性,我非常喜欢这个工具。只要出了公司,我就不实时了。但是 Hangouts Chat,可以让你随时找到 TW 的任务一个员工。
不过,我们使用企业微信来作为企业内部的 IM,因为它真的只是一个 IM 工具。你可以使用它来找到 ThoughtWorks 中国的员工。我期待有一天,工作上的事情都扔到企业微信,这样我也许就能有机会在朋友圈吐槽一下公司。
## Always On 方式
如果你需要实时和其他/她人保持联系,一个有效的方式就是采用 Always On 的方式。即,通过长期开启视频或者语音的方式来实时保持联系。你可以通过你的 iPad 来做类似的事情。
> Always-on 可以帮助分布在不同地点的团队成员虚拟的面对面沟通,及时解决问题。敏捷 12 条原则中第 4 条 “敏捷在整个项目开发期间,业务人员和开发人员一起工作”,这种 Always-on 的模式,就是为了实现这个原则。——《提升业务响应力:践与行》
不过,我觉得当远程办公慢慢成为一种选择的时候,你可能需要一个 Always On 在你家里 —— 因为总有些老板不信任你。
所以,这种最合适的 Always On 设备可能就是带语音功能的摄像头了,[dog][dog] 1·a欢迎来到被监视的世界。
## 管理工具
这一类工具太多了,这里就不一一介绍了,简单地说一下,我们现在项目的工具:
- 敏捷项目管理工具 Trello。
- 代码托管工具 GitHub / Gitlab。
- ……
## Timebox
为了分清白天和黑夜,你需要一个明确的时间信号。什么时候是工作状态,什么时候是生活状态。特别是当你在家工作的时候。
上班了。
9:30 的站会时间。为了把你从床上叫醒,你需要一个明确的信号,所以我觉得晨会是一个伟大的坑爹发明。它也能明确了,你确实是按时上班了。
顺便一提,在敏捷团队里我们通过每日站会,来检视完成 Sprint 目标的进度,并检视完成 Sprint 待办列表的工作进度趋势。所以,这是一个项目管理人员喜欢的时间。
5:00 的代码检视时间。结合 Intellij IDEA + Zoom 和你的小伙伴们解释一下你今天写的代码吧。
下班了。
## 番茄工作法
我并不觉得番茄工作法的工具好用,主要是我觉得使用工具太麻烦。所以,我并不会推荐相关的工具,但是呢我觉得番茄工作法很不错。
每工作 25 分钟,你就应该走 5 分钟。每工作 50 分钟,你就应该休息 10 分钟。
这不是偷懒,这是为了更好的工作,更有效率的工作。
## 运动
结束完每天的工作之后,如果天气好,我和花仲马会在院子里打一会儿羽毛球。
如果你没有这样的环境,我建议你可以考虑站立式办公,你只需要一个升降桌。
## 其它
我司让同事工作到月底,我们也还在封村,朝霞已经出来了。
你们呢?每个程序员必知之:程序员差别的本质2014-05-22T01:00:18+00:002015-08-08T05:38:58.759694+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/think-about-technology-and-tools/当我开始在阅读《技术的本质》的时候,我就开始在思考这样一个问题,我们在使用技术还是工具。
![技术的本质][1]
##技术与工具
在某百科上说
> 一项技术是关于某一领域有效的科学(理论和研究方法)的全部,以及在该领域为实现公共或个体目标而解决设计问题的规则的全部。
对于技术不同的人的理解可能是不同的,和上图中的使用工具类似的是,和工具一样,技术也在不断地成长和进行。网站的成长史似乎可以简化为下面的过程,可能还会有ASP.NE等等,只是因为我接触得比较少。
- 静态的HTML
- CGI和Perl脚本
- PHP
- J2EE
- Django
- Ruby on Rails
- Nodejs
实际上这是技术的一种演变,然而做为最核心的东西HTML似乎还是那样的。作为新技术产生的核心——HTML也在不断也进化中。然而,没有想象中的那么明显,看上去像是不变的,只是技术在不断地向前前进。对于我们来说这些都是工具,有时我们在用工具创造中新的工具,好比是技术本身,通过结合一些技术创建出新的技术。同进化史一般,我们没有办法从无到有创造出一个新的东西,没有上帝。
而作为一个普通的程序员,我们所做的只是在使用工具,从芯片到语言,从语言到框架,从框架到实现。
##编程的秘密
每个人在技术的成长过程中都有不同的经历,对于我来说现在的总结大概是如此(ps:有兴趣可以参考[过去的那些语言](http://www.phodal.com/blog/past-computer-language/))。
- 当我开始学习第一种语言``LOGO``时,我还小觉得很神奇,至少对于计算机还是保持神秘的。
- 当我开始学习**C++**时,由于作者对于其优雅的宣称,我觉得**C++**确实很优雅、
- 当我开始学习``Python``的时候,我发现**简单**才是我所要追求的。
- 当我开始学习**Ruby On Rails**的时候,我发现生成可以很强大,但是因为强大,所以没有意思。
- 当我开始学习``Django``的时候,我发现这才是我想要的订制。
- 当我开始写``博客``的时候,我觉得比于**HTML**来说,**Markdown**才是适合我的。
- 当我开始写下此文时,我开始觉得我**应该试着去做点什么**。
于是我又回到了原点,开始迷茫我想要的是什么?当我实习半年以后,我学到了更多的东西([实习半年后:正在变得高效](http://www.phodal.com/blog/thoughtworks-intern-how-to-be-a-zen-programmer/)),而我开始的时候我才在偶然的一次机会中才了解到,我们用的都是工具。只是,我们可以用工具创造出工具。
编程只是用来解决问题的工具,优美与否对于解决问题的帮助,取决于是一次性问题还是长期问题。编程的核心是解决问题,正如SEO的核心是内容(详情见:[每个程序员必知之SEO](http://www.phodal.com/blog/every-programmer-should-know-how-seo/))。于是,
> 我们把一个又一个的迷团解开了,剩下百无聊赖。
当我们在讨论生产率的时候,得知高级语言会比低级语言来得有生产率,但是效率可能会因人而异。高级语言来自于低级语言,这些似乎没有那么重要。人们熟悉了不同的IDE、不同的语言,相比于那些入门者来说,谙熟语言的人只是更加熟练罢了。同《卖油翁》的``我亦无他,唯手熟尔``般,对于有些东西只是因为用多了,然后熟悉罢了。事实真的是这样么?如果我们每天写的是**1+1=2**,我们会知道**1+2=3**么。
> 那么所谓的优秀的程序员和普通的程序员的差别在哪?
##技术的成长
这里的技术指的不是个人在技术上的成长,而是技术自身的成长。
> 技术在某种程度上一定是来自此前已有技术的新的组合。
一个优秀的框架、软件、系统的产生必然会基于其他的已有技术或者框架,如:
Ubuntu GNU/Linux
- 内核是Linux
- 编译器GCC
- 库GLIBC等等
- 脚本语言Python等
- Bash
- 等
而这其中的一些小命令如ls、cd、wget也是这个系统的组成部分之一,我们无法找到一个不依赖于其他系统的软件。如果你自己动手编译过Linux,或者你会更有体会一个GNU/Linux系统需要什么。从一个库来说它是基于其他的基本库,如C标准库,而从C标准库的编译又依赖于编译器,这些都循环中前进着。
gcc4.7编译出了gcc4.8
gcc4.6编译出了gcc4.7
gcc4.5编译出了gcc4.6
等等
这是对一个可以自身编译自身的编译器而言,我们无法忽视的是技术背后有许多细节。巨人是站在巨人的肩膀上,过去我们可能一群工程师一个月开发出来的软件,在今天可能可以由一个工程师一天开发出来。因为我们可以基于前人的经验及教训,而这也是所谓的高生产率的程序员和一般的程序员间的区别。
自然而然的优秀的程序员吸收了其他人的经验以及教训,换在今天来说,你今天所在的位置并不是因为你比别人聪明,或者是别人比你聪明,只是因为你**吸收了更多的知识及经验**。当然,教育不公平不应该这边的讨论范围。
##程序员的差别
回到开始的话题,我们使用的如图所示的工具的话,你会选择
- 石头
- 矛
- 电钻
- 电脑
中的哪一个,这是一个有趣的话题,正如。。
- 汇编
- C语言
- Python
- Django
这个问题没有一个真正的答案取决于你所做的事,而问题的关键在于你知道的只是``汇编``,而不知道有其他东西的存在。这里的意思不是让你把上面的都学了,而是对于我们所处的领域我们应该有一个宽泛的了解。了解并不一定是亲身实践,如上一标题所说,我们只需要去**吸收别人的知识及经验**,一个有趣的答案便是**从别人身上学习会更快**。只是在那之前,我们需要去学会学习,因为你可能处在某个位置,没有其他人做过。
而对于标题的答案来说应该是:
> 优秀的程序员不仅仅只是使用工具。
[1]: /static/media/uploads/about_tools.jpg《REWORK》启示录 音乐应在你的指尖流淌——工具和代码无关2013-11-09T21:16:52+00:002014-05-14T16:33:56.753004+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/think-of-rework-4-best-tool/Tone is in your fingers
======================
一个好的工具确实有助于编程,但是他只会给我们带来的是帮助,最后的代码风格,我们写出来的代码还是和我们的水平保持着一致的。什么是好的工具,这个说法就有很多了,但是有时候我们往往沉迷于事物的表面,有些时候Vim会比Visual Studio强大,当你只需要修改的是一个配置文件的时候,简单且足够快捷,在我们还未用VS打开的时候,我们已经用Vim做完这个活了。
音乐就在你的指尖流淌
====================
“好的装备确实能带来一些帮助,但事实是,你的演奏水平是由你自己的手指决定的。”
DW还是notepad++?
-----------------------------
Adobe Dreamweaver确实是一个不错的工具,虽然一直用的是和谐版的。这样有两个不好的地点,当我们依赖上这个工具的时候,我们不得不开始去负担他的费用。有时候我们不得不在终端下面编程他们,如果是windows服务器自然是无所谓了。DW在有些时候忽略了太多的东西,曾经试着去用过一段时候,感觉效果还不如notepad++加上chromium来得简单呢。
作为一个IDE有时候忽略的因素会过多,一开始的代码由类似于notepad++或者sublime text之类的编辑器开始会比较合适。于是我们又开始陷入IDE及Editor之战了,无聊的时候讨论一下这些东西是有点益处的。相互了解一下各自的优点,也是不错的,偶尔可以换个环境试试。
刚开始学习的时候,我们只需要普通的工具,或者我们习惯了的工具去开始我们的工作。我们要的是把主要精力放在学习的东西上,而不是工具。刚开始学习一种新的语言的时候,我们不需要去讨论哪个是最好的开发工具,如java,有时候可能是eclipse,有时候可能是vim,如果我们为的只是去写一个hello,world。在eclipse浪费太多的时间是不可取的,因为他用起来的效率可不比你在键盘上敲打来得快,当你移动你的手指去动你的鼠标的时候,我想你可以用那短短的时候完成编译,运行了。
工具是为了效率
-----------------------------
寻找工具的目的和寻找捷径是一样的,我们需要更快更有效率地完成我们的工作,换句话说,我们为了获取更多的时间用于其他的事情。而这个工具的用途是要看具体的事物的,如果我们去写一个小说、博客的时候,word或者web editor会比tex studio还得快,不是么。我们用TEX来排版的时候会比我们用WORD排版的时候来得更多快,所以这个工具是相对而论的。有时候用一个顺手的工具会好很多,但是不一定会是事半功倍的。我们应该将我们的目标专注于我们的内容,而不是我们的工具上。
我们用Windows自带的画图就可以完成裁剪的时候,我们就没有运行起GIMP或者Photoshop去完成这个简单的任务。效率在某些时候的重要性,会比你选择的工具有用得多,学习的开始就是要去了解那些大众推崇的东西。
学习SEO用WordPress还是CMS?
-------------------------------
我们只是为了学习而去选择工具的,最后的最后,我们理解完成的时候,我们就不再局限于某个工具。我们已经学会了如何去做,我们可以用另外一个比喻来定义,就是Make in China。因为已经知道怎么去做了,学会怎么去做比做的过程更加重要了。我们纠结在做的过程上的时候,别人教会我们怎么做,所以我们还是在别人的后头。学习就是这样的过程,学习的时候我们学的都是别人谙熟的东西。
Wordpress是一个强大的学习工具,我们也可以用于生产中。和CMS相比,这样一个博客显得不是很重要,但是我们想学的只是SEO,而不是如何去做CMS。只是两者是等价的,只要我们能再快的学习SEO,那么选哪个其实都是一样的。
学习技术的过程中,如何去学习也是一门艺术,而所谓的艺术就是用科学无法解释的东西。所以我们怎样去学习,没有人会给我们一个完整的答案,我们可以模仿那些已经学习成功的人去学习,但是不一定是合适的。不同性格的人之间可能会有不同的答案,同种性格的人之间也可能有不同的答案。
了解、熟悉你的工具
------------------------------
Windows的功能很强大,只是大部分人用的是只是一小小部分。而不是一小部分,即使我们天天用着,我们也没有学习到什么新的东西。和这个就如同我们的工具一样,我们天天用着他们,如果我们只用WORD来写写东西,那么我们可以用Abiword来替换他。但是明显不太可能,因为强大的工具对于我们来说有些更大的吸引力。
如果你负担得起你手上的工具的话,那么就尽可能去了解他能干什么。即使他是一些无关仅要的功能,比如Emacs的煮咖啡。有一本手册是最好不过的,手册在手边可以即时查阅,不过出于环保的情况下,就不是这样子的。手册没有办法即时同你的软件一样更新,电子版的更新会比你手上用的那个手册更新得更快。
Linux下面的命令有一大堆,只是我们常用的只有一小部分。如同CISC和RISC一样,我们所常用的指令会让我们忘却那些不常用的指令。而那些是最实用的,如同我们日常工作中使用的Linux一样,记忆过多的不实用的东西,不比把他们记在笔记上实在。我们只需要了解有那些功能,如何去用他。
语言也是一种工具
-----------------------------
越来越多的框架和语言出现、更新得越来越快。特别是这样一个高速发展的产业,每天都在涌现新的名词。如同我们选择语言一样,选择合适的有时候会比选得顺手的来得重要。然而,这个可以不断地被推翻。
当我们熟悉用Python、Ruby、PHP等去构建一个网站的时候,Javascript用来做网站后台,这怎么可能——于是NodeJS火了。选择工具本身是一件很有趣的事,因为有着越来越多的可能性。
过去PHP是主流的开发,不过现在也是,PHP为WEB而生。有一天Ruby on Rails出现了,一切就变了,变得高效,变得更Powerful。MVC一直很不错,不是么?于是越来越多的框架出现了,如Django,Laravel等等。不过的语言有着不同的框架,Javascript上也有着合适的框架,如Angular js。不同语言的使用者们用着他们合适的工具,因为学习新的东西,对于多数的人来说就是一种新的挑战。在学面向对象语言的时候,人们很容易把程序写成过程式的。
没有合适的工具,要么创造一个,要么选择一个合适的。
小结
---------------
学习Django的时候习惯了有一个后台,于是开始使用Laravel的时候,寻找Administartor。需要编译的时候习惯用IDE,不需要的时候用Editor,只是因为有效率,嵌入式的时候IDE会有效率一点。
习惯用DW来格式化HTML,Aptana来格式化Javascript。
习惯用Wordpress来写博客,因为可以有移动客户端,使用电脑时就不喜欢打开浏览器去写。
等等
等