老生常谈:绝不要拷贝代码!!

首先要说一句老话,拷贝是万恶之源,是最差实践之首。

前段时间,组里有个同事实现某个新功能,其实挺简单的,前后大约做了两周。最后在Code Review的时候,发现有很多没调用到的方法和变量,代码逻辑很奇怪,然后发现代码是从另一处Copy过来的,只是稍作加工。再然后,我就让另一名工程师加入一起清理代码,又花了4天才把逻辑理清楚。清理之后的代码比之前少了60~70%,更易于维护。这一切都是Copy Code惹的祸。

为什么拷贝代码?

省工夫省时间?

Copy/Paste, so fast! 这是非常非常短视的想法,甚至有时连短期的工夫和时间都没有节省到。因为老代码里有大量逻辑,不一定拷贝过去可以直接使用。这时必然Bug漫天飞,怎么能过的了QA那关。长远看就更加不可取,无数血泪的经验,大量重复代码是项目的灾难,不可能有好的设计,后期维护的工程师会叫苦连天,工期不断延后,质量只能是垃圾,不要期盼有什么保证。垃圾的代码也留不住好的程序员,学不到任何东西,他们的青春为什么拿来给别人擦屁股。

时间和工夫有时不能省的,要耐着性子看老代码里的逻辑,”慢就是快“。

”某种项目需要“!

还有另一种可能-项目需要!一些稍大的公司或组织会同时进行几个项目,新的项目可能会在老项目的代码上扩展。为了节省工期,有些Team就直接把老项目的代码在新项目的Branch上拷贝一份。开始一切很祥和,可新老项目同时继续,同时在修Bug,加Feature。时间长了,就有可能在不同的代码Branch做Merge,也是要花大量的时间和精力。究其根源有很多,可能真是工期紧,可能是老代码的设计太差。

我觉得设计的问题大一些。这不是理想的做法,应该把需要依赖的代码做提取,对于不同行为做抽象,再以注入等方式改变所依赖代码的行为。

如何避免代码里的Duplication?

  • 做为工程师应该了解,Code不单是为别人写的,也是给未来的自己写的。不想六个月之后砸键盘吧!时刻牢记”Duplication is evil!”
  • 做好培训,尤其是新手。大多新手带着从学校实验室的“恶习”(想想那些教授老板也被坑的不轻,还不自知),入职后老员工的”传帮带“很重要。
  • 鼓励做代码重构,罗马不是一天建成的,代码也不是一天就能变好。
  • 制定Team里的Coding Guideline,加强Code Review。大家都知道”破窗理论“,有规则才能遵守,不然只能越来越糟。
  • 组织里要有分享代码的意识,多做独立于产品的可复用的代码模块。假以时日就可形成客观的代码“资产”,大大加速日后的开发和团队效率。
  • 使用SonarQube实时掌握重复代码的情况。SonarQube是个非常强大的工具,帮助团队实时的监控代码质量的变化,Duplication就是其中的一个维度。

5-22-2015 5-37-39 PM总结

不要拷贝代码。That’s it!

 

Google Guava之Table

这个小例子介绍如何使用Guava提供的Table类。

 

Google Guava之Objects

Guava Objects是个非常好用的类,帮助我们写出hashCode(), equals()和toString()。

看下面的小例子。

 

C41彩色负片摄影

自从成功D76黑白胶片冲洗之后,就对彩色胶片跃跃欲试。对比黑白胶片,C41彩色负片的冲洗要复杂的多,步骤多,尤其要控制在显影(Develop)阶段(约3分30秒)的温度。在长时间的准备后,试着自己冲洗了几卷Kodak Professional Portra 400 Color Negative Film。第一卷比较失败,色偏的厉害,慢慢掌握之后,后面几卷还不错,放几张上来让大家看看效果吧。之后,我会做个完整的教程。

20150419_78-8.jpg

20150419_78-6.jpg

20150419_76-5.jpg

20150412_73-6.jpg

20150412_72-7.jpg

20150412_70-4.jpg

More on flickr.

How to specify the configuration file when starting mysqld?

In our development machine, I don’t have the root permission to install MySQL server. But our SonarQube needs it.

Fortunately, if you using the MySQL TAR archive, “root” is not required to launch mysqld but you need specify the configuration file. The default one uses some folders which need root to access.

Here is the sample mysqld configuration. You can also start from a configuration file in folder support-files.

Basically, you need specify the basedir and datadir to tell mysql where it’s installed and where the database files should be put.

Other settings can keep the same as defaults in my case. Then I start the server instance. Option “–defaults-file” is important.

 References

读《最后期限》

一本挺有意思的老书!作者把项目管理的知识融入了一个离奇的、不可能在现实世界发生的项目(或者叫实验或冒险),最后再加上一个完美的英雄美人式的大结局,让我等IT男屌丝情何以堪啊。 这Project Manager也太美了吧,”财色兼收“啊!

故事之外,有些道理挺好,摘几句有感触的。

  • 度量每个产品的规模,运用各种工具和方法做好估算。
  • 压力之下人无法快速思考。短期的压力对团队可能是有益的,帮助团队成员集中注意,但长期的压力一定是错误的。(深有感触!)
  • 生产力提高来自长期的投资,平时要加强团队学习和建设。(罗马不是一天建成的)
  • 除非必要,否则不要自己去凝聚一个团队:出去找已经成型的团队。(这就是为什么要挖挖一窝吧)
  • 项目开始的浪费一天和Deadline之前浪费的一天,它们的危害是相同的。(珍惜时间)
  • 组织里时常有“神经”的人,提一些不可能的需求,如不可能的deadline. 你不能满足所有Stakeholder的需求,要寻求影响力更大人的帮助,再不然,可以考虑走了。别想根治一个状态的人。(主人公的做法在现实中是不可取的。)
  • 不要辱骂团队成员,没人能在辱骂之后表现的更好。
  • 拒绝含糊的规格文档。(实现和其他产品一样的功能!OMG)
  • 适当的处理团队中的冲突。
  • 项目需要仪式!

Set of P4 Command Alias

VirtualBox果然还是不及VMware, 越用越慢,让人崩溃啊。现在公司又不让自己装软件了(正版也不行),只好另辟蹊径。好在Java可以跨平台,于是便在Window 7里新搭了开发环境,在Window下写代码和Unit Test,去Linux下编译验证,代码通过P4 Shelve传递。几次下来,发现P4 Command挺方便,总结几个Alias和大家分享。 :lol:

 

Print more logging messages during debugging

Sometimes, in debug mode,  more logging messages could be very helpful. We can change code to add more logs. But it’s not efficient as the code need to be re-compiled and later some log message may need to be removed after debugging.

Java debugger provides very powerful way to achieve this, which allows to print more messages and even more.

Take Eclipse for example, here I have a simple HelloWorld to calculate the sum from 0 to 99. In debugging, I want to see how sum changed in the loop but I don’t want to stop application and click “Continue” every time.

12-12-2014 5-31-25 PM

So first, I added a break point on line 8. Next, I edited the “Breakpoint Properties”. In the conditional text input, you can print some message first and make the return of expression as false.

12-12-2014 5-35-40 PM

To return false will make debugger not stop at line 8, but just print the log messages I want.

12-12-2014 5-37-57 PM

You can see it’s totally non-intrusive. Actually, you can put more complicated statements there and also you can control when to return true or false. It’s very flexible. In other IDEs, such as JetBrains IDEA and Netbeans, there are similar functions.

Mount samba file server to Linux Mint 17

1. Install cifs-utils package

2. Create a file for authentication information with root account

3. In authentication file, please specify username, password and domain.

4. Modify /etc/fstab file and to mount the samba at start-up.

Add following line to the end.

then use “mount -a” to mount immediately.

 

New virtual environment after laptop re-image

公司电脑终于被Re-image了,再也没有了Admin的权限,除了portable的软件,其它都要在系统里Order,然后推送。系统里的软件很少,五笔输入也没有一个。VMWare也是再也不能装了,虽然有正版的License,好在开源VirtualBox是可以的。在安装了新的Linux Mint 17环境之后,然后我惊喜的发现,VirtualBox和VMWare在使用上的感觉差别不大了,速度也很快。

又要开始工作了,在新环境里很爽!

一个小Tip,VirtualBox 4.2.16的Additions有点问题,要下载安装4.3.x的Additions。Maybe that’s for newer Linux!

没事写写博客,没事拍拍照片。。。

HTML Snippets Powered By : XYZScripts.com