分类 Coding 下的文章

关于烂代码的那些事(下)

假设你已经读过烂代码系列的前两篇:了解了什么是烂代码,什么是好代码,但是还是不可避免的接触到了烂代码(就像之前说的,几乎没有程序员可以完全避免写出烂代码!)接下来的问题便是:如何应对这些身边的烂代码。

改善可维护性

改善代码质量是项大工程,要开始这项工程,从可维护性入手往往是一个好的开始,但也仅仅只是开始而已。

重构的悖论

很多人把重构当做一种一次性运动,代码实在是烂的没法改了,或者没什么新的需求了,就召集一帮人专门拿出来一段时间做重构。这在传统企业开发中多少能生效,但是对于互联网开发来说却很难适应,原因有两个:

  1. 互联网开发讲究快速迭代,如果要做大型重构,往往需要暂停需求开发,这个基本上很难实现。
  2. 对于没有什么新需求的项目,往往意味着项目本身已经过了发展期,即使做了重构也带来不了什么收益。
Read the rest

使用Spock框架进行单元测试

关于单元测试

很多人一谈到单元测试就会想到xUnit框架。对于一些java新人来说,会用jUnit就是会写单元测试,高级点的会捣鼓一下testng,然后就认为自己掌握了单元测试。

而实际上,很多人不怎么会写单元测试,甚至不知道单元测试究竟是干什么的。写单元测试要比写代码要难上许多,而这里说的难度跟框架没什么关系。

所以,在开始介绍spock之前,需要先抛开框架,谈谈单元测试本身的事情。在理解了单元测试之后才能更清楚spock框架是什么,以及它否能够更优雅的解决你的问题。

单元测试是什么

写代码免不了要做测试,测试有很多种,对于java来说,最初级的就是写个main函数运行一下看看结果,高级的可以用各种高大上的复杂的测试系统。每种测试都有它的关注点,比如测试功能是不是正确,或者运行状态稳不稳定,或者能承受多少负载压力,等等。… Read the rest

关于烂代码的那些事(中)

什么是好代码

写代码的第一步是理解什么是好代码。在准备bootcamp的课程的时候,我就为这个问题犯了难,我尝试着用一些精确的定义区分出“优等品”、“良品”、“不良品”;但是在总结的过程中,关于“什么是好代码”的描述却大多没有可操作性

好代码的定义

随便从网上搜索了一下“优雅的代码”,找到了下面这样的定义:

Bjarne Stroustrup,C++之父:

  • 逻辑应该是清晰的,bug难以隐藏;
  • 依赖最少,易于维护;
  • 错误处理完全根据一个明确的策略;
  • 性能接近最佳化,避免代码混乱和无原则的优化;
  • 整洁的代码只做一件事。

Grady Booch,《面向对象分析与设计》作者:

  • 整洁的代码是简单、直接的;
  • 整洁的代码,读起来像是一篇写得很好的散文;
  • 整洁的代码永远不会掩盖设计者的意图,而是具有少量的抽象和清晰的控制行。

Michael Feathers,《修改代码的艺术》作者:… Read the rest

关于烂代码的那些事(上)

写烂代码很容易

刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。

当时的我在听到这种观点时会有一种近似于高冷的不屑:你们就是一群傻X,根本不懂代码质量的重要性,这么下去迟早有一天会踩坑,呸。

可是几个月之后,他们似乎也没怎么踩坑。而随着编程技术一直在不断发展,带来了更多的我以前认为是傻X的人加入到程序员这个行业中来。

语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。

很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中烂成一坨翔一样的代码。… Read the rest

如何从菜鸟程序员成长为(伪)高手

想起当初刚入职,新人培训的时候,也跟其他同事讨论过这个问题:如何才能成为业界大牛?当时自己只是觉得兴趣是最好的老师,思路方法什么的没有多想。

加入微博平台架构部的时间也不短了,趁着快过春节总结了一下自己入职微博以来的工作情况,从互联网开发的半个门外汉,到如今能设计一些架构、排查一些问题、分享一些经验,收获颇多,感想颇多,也逐渐意识到思路和方法的重要性,在此跟大家分享一下。主要分为学、做、想三方面。

学会学习

学习无疑是程序员最为重要的素质之一,尤其是互联网这种日新月异的行业,把学习当做工作的一大半也不为过。

自主学习

最近发现身边的人并不是不想学习,只是每天都在纠结自己到底学什么好:简单的没挑战,复杂的看不懂;旧技术怕过时,新技术没方向……

讲讲自己毕业后的经历,毕业之后去了个不大不小的公司,工作主要是做一些XX管理系统之类的东西,没什么挑战,也用不上什么技术,基本上前端用个extjs后面套个sql… Read the rest

重构与代码质量

烂代码

在讨论烂代码之前,我需要先发一下感慨:优雅的程序都是类似的,恶心的代码却各有各的恶心。这些烂代码就好像是喝醉了的人说胡话,你根本无法了解这个人当时在想什么 — 大概他们真的什么都没想。

虽然有些片面,但我还是决定这些形态各异的烂代码做个总结:

  1. 高耦合

    假如在面试的时候问求职者:面向对象设计需要遵循什么原则呀?大概没有人会答错:高内聚低耦合。但工作中能做到这一点的人却少之又少,于是便出现了一些几万行代码的大工程;几十个方法的Service类;几百行的函数,等等。
    后来便出现了这种事情:想要依赖某个工程里一个简单的方法,加上依赖之后发现打完包的工程里莫名其妙多了几十个jar包和满屏幕的依赖冲突;改一个简单逻辑却无从下手,只能一遍又一遍的研究那段成百上千行的函数……

  2. 拷代码

    有时候我会觉得,拷代码简直是程序员的天性。尤其是在你跟一个程序员强调说模块间要低耦合之后,一些跟主流程无关的代码便会出现在各个类的角落里。

Read the rest

php与ruby共享session实现单点登录

背景

前一阵部门要做一个内部讨论区,希望能和原有的gitlab集成在一起。

discuz虽然成熟但是感觉不够高大上,找了几个ruby的论坛discourse,rabel虽然时髦值够了但是成熟度又缺了点,最后选了php的question2answer作为论坛程序,采用iframe的方式嵌入原来的gitlab程序。

单点登录方案

共享cookie

  • 在cookie里保存user的信息,php读cookie并取得用户信息。
  • ruby和php程序要在同一个域名
  • cookie在客户端是可见的,一般要对cookie进行加密。
  • 数据不安全

共享session

  • 在cookie里保存ruby session信息,php获得session信息后读session数据。
  • ruby和php程序要在同一个域名
  • session内容客户端不可见。

cas

  • 通过统一认证服务登录
  • ruby和php登录时重定向至认证服务器,通过验证后回调相应服务保存token,之后只要具体服务向cas请求token是否过期就可以判断是否登录。

由于两个业务在同一个域名下,这里就放弃了复杂的cas方案;考虑源代码安全,没有用cookie存储用户信息,最后决定使用共享session的方式实现单点登录… Read the rest

关于Windows系统上QT5的程序发布

今天在发布QT5程序的时候发现依赖的DLL相较于QT4多了很多,如果使用动态编译的话,一个最简单的GUI程序需要以下这些库的支持:

使用正则表达式判断二进制数字是否能被3整除

问题

写一个正则表达式,匹配所有能被3整除的二进制数。比如:
11 √
110 √
1001 √
1011 ×

整除与余数

判断一个数能否被另一个数整除,可以转化为判断一个数被另一个数除后的余数是否为0。假设被判断的数为N,除数为m,余数为d,那么有:
N=i*m+d

假设有N=abcde=a*x^4+b*x^3+c*x^2+d*x+e,(x为进制)。
同时定义N(0)=0,N(1)=a,N(2)=ab……N(5)=abcde,那么有:
N(0)=0      N(0)%m=0
N(1)=a      N(1)%m=a%m
N(2)=a*x+b  N(2)%m=(a*x+b)%m

由于取余满足性质:
(1) (a+b)%c = ((a%c)+(b%c))%c;
(2) (a*b)%c = ((a%c)*(b%c))%c;

那么:
N(2)%m=(a*x+b)%m
             =((a*x)%m+b%m)%m
             =((a%m*x%m)%m+b%m)%m
             =((N(1)%m*x%m)%m+b%m)%m

也就是说,判断N是否能被m整除,可以转换为关于N的每一位数字、被除数和进制的递推公式Read the rest

分类目录