分类 Coding 下的文章
关于烂代码的那些事(下)
假设你已经读过烂代码系列的前两篇:了解了什么是烂代码,什么是好代码,但是还是不可避免的接触到了烂代码(就像之前说的,几乎没有程序员可以完全避免写出烂代码!)接下来的问题便是:如何应对这些身边的烂代码。
改善可维护性
改善代码质量是项大工程,要开始这项工程,从可维护性入手往往是一个好的开始,但也仅仅只是开始而已。
重构的悖论
很多人把重构当做一种一次性运动,代码实在是烂的没法改了,或者没什么新的需求了,就召集一帮人专门拿出来一段时间做重构。这在传统企业开发中多少能生效,但是对于互联网开发来说却很难适应,原因有两个:
- 互联网开发讲究快速迭代,如果要做大型重构,往往需要暂停需求开发,这个基本上很难实现。
- 对于没有什么新需求的项目,往往意味着项目本身已经过了发展期,即使做了重构也带来不了什么收益。
使用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
重构与代码质量
烂代码
在讨论烂代码之前,我需要先发一下感慨:优雅的程序都是类似的,恶心的代码却各有各的恶心。这些烂代码就好像是喝醉了的人说胡话,你根本无法了解这个人当时在想什么 — 大概他们真的什么都没想。
虽然有些片面,但我还是决定这些形态各异的烂代码做个总结:
-
高耦合
假如在面试的时候问求职者:面向对象设计需要遵循什么原则呀?大概没有人会答错:高内聚低耦合。但工作中能做到这一点的人却少之又少,于是便出现了一些几万行代码的大工程;几十个方法的Service类;几百行的函数,等等。
后来便出现了这种事情:想要依赖某个工程里一个简单的方法,加上依赖之后发现打完包的工程里莫名其妙多了几十个jar包和满屏幕的依赖冲突;改一个简单逻辑却无从下手,只能一遍又一遍的研究那段成百上千行的函数…… -
拷代码
有时候我会觉得,拷代码简直是程序员的天性。尤其是在你跟一个程序员强调说模块间要低耦合之后,一些跟主流程无关的代码便会出现在各个类的角落里。
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程序需要以下这些库的支持:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
icudt49.dll #ICU(International Component for Unicode,Unicode工具)依赖库 icuin49.dll #ICU依赖库 icuuc49.dll #ICU依赖库 libEGL.dll #EGL依赖库,为OpenGL提供接口 libgcc_s_sjlj-1.dll #mingw依赖库 libGLESv2.dll #EGL依赖库,为OpenGL es提供接口 libstdc++-6.dll #mingw依赖库 libwinpthread-1.dll |
使用正则表达式判断二进制数字是否能被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