小公司不等于小作坊

最近在两家差不多规模的公司实习,作为一个还没毕业的实习生,谈谈感受。

第一家公司是外包公司,业务是一些政府项目和外包项目,用的技术不会很深入,比如安卓开发用HBuilder写前端搞定,直播等功能用不同的SDK,也不会深入一个项目,基本上交付了就完事。第二家公司做平台,做了几年一直在开发此平台,代码也很庞大了(从github clone下来用了两个小时……)。以下简称外包公司和平台公司。

新员工培训方面。外包公司领导简单问了我一下情况,接下来的实习就是根据外包项目的需求让学习,第一天做了配置HBuilder和SpringMVC,第二天看安卓,第三天研究直播通话,第四天写个Ajax。可以说,一点东西都学不到。领导非常忙(为什么忙,下面提)。平台公司,我上班的第一天,领导发过来一个《Git分支管理指南》,一个《新员工快速成长计划》,拉近Github项目组,说你对着文档把环境搭起来,有问题找我。

沟通方面。外包公司靠喊,QQ,平台公司靠早会、邮件。外包公司喊的方式缺点是不容易控制大家的工作,基本上是老板想起来什么事情就喊一下布置,员工有什么事情也通过喊一下报告,另外这种“广播”的方式,很烦人,有些事情不关我事,又屏蔽不了,我估计用这种方式领导也比较容易焦头烂额。有个好处是,我现在就在上班时间写博客,没人知道。有一点我比较方案的是公司特别依赖QQ,文件在QQ传,任务也在QQ布置。这样做无法对应到个人,记录不好管理,话说不清楚。平台公司开早会,一般20分钟,开完之后一天干什么大家都知道了,一天中基本没人说话,领导有个配置文件需要发给我,都是用邮箱发的,工作效率非常高。不写日报,只有周六(暴露周六也上班也)晚上开周会总结。这样也有一点不好,大家的沟通比较少,我入职近两个月,没有同事的QQ、微信和电话,我估计除了我他们之间也不会常联系。某天在博客园偶尔看到以前一位同事的博客,说他自己离职的原因就是这个公司没有工程师文化,同事之间交流太少了,没有归属感。

版本管理。外包公司用svn,所有人一条分支,log随便写,领导喊:“小王你那XXX做完了吗?做完了提交下,先更新再提交哦不然会冲突”。平台公司有一份分支管理文档, 所有人都要学习。官方repo只有master和release分支,tag使用严格规范,领导review所有pr,使用issues。原则是快速回退,灵活发布bugfix。我认为这两种都比较合理,外包公司项目多,生命周期短,不需要后期维护,所以采用员工学习成本低的方式合情合理,但是如果平台公司这么管理,就比较恐怖了……

绩效考核。作为实习生,不是特别了解。不过就目前看来,外包公司看老板心情。从我微信联系人的备注来看,已经有三分之一的员工被我打上了“马屁精”的tag。另外还要每天写日报,烦。平台公司,每周日上司群发大家的绩效,我不是很清楚机制,应该是根据工作量来的吧。

问题处理。作为很菜的实习生,肯定能遇到很多问题。上面说了外包公司的领导比价忙啦,所以遇到问题领导一般都会告诉你自己想办法解决,给你个大体思路,我经常埋头搞好几天,而且都是一些配置问题,查的多,试的多,自然解决的了,但是走了很多弯路。平台公司,第一天配置环境的时候遇到了几个问题,有几次领导直接在我电脑上调了一会帮我搞定。就这一会让我见识了调试的方法,怎么一口气写那么长的命令,和一些高效用Linux的习惯。

团队合作和技术。写到这里,想必大家都应该清楚了。外包公司基本上每个人都写Java,前端,爬虫啥的,虽然十几个开发专注点有侧重,但是不是很精通。团队之间的合作比较糟糕,有一个周,领导给我的任务是……改别人写的前端代码。别提多痛苦了,内嵌style,被覆盖无数次的css,表现良好代码却匪夷所思各种relative,absolute混乱。平台公司工作时间不长,暂不表。

个人感受。我现在兼职实习加起来有四份工作。去外包公司感觉很累,搬砖嘛……没啥技术含量,做的事情都是别人做了无数次的,想想第二天要上班愁得慌。去平台公司比较积极,虽然晚上8点才回来(糟,暴露996了),更累一点,但是学到东西不少,也不会感觉自己的时间浪费掉了,做的东西还是有价值的。

有一点体会就是,虽然外包公司大领导也整天在群里(注意是QQ群)强推用邮件交流,但是白说。我感觉领导的作用比较大,比如外包公司的领导写代码,我们叫他大哥,领导很忙,晚上十点多十一点多走,活在终端里的那种人,所以代码规范什么的,员工都听话。外公公司领导就是领导,一行代码不写。很多事情说了也白说。做事靠经验。

反正不看代码就是不行。我觉得好的领导是写代码的领导。

之前看到这篇博客,谈了大团队和小团队的区别:

small-group-vs-big-group

可以说,这两个公司是上面两种典型。但是我认为小公司不一定就不能有大公司的管理,管理得当,不仅可以保持小公司灵活,动作快,又不会陷入大公司反应迟钝的泥潭。

我的博客不会给我的雇主做广告,永远保持独立性,不会写任何软文性质的东西。两家公司都匿了名,普通读者也猜不到。不过我相信,外包公司永远在搬砖,平台公司总有一天大家都会听说的。

——读者止步——

至于为什么我去外包公司实习,妈的我要吐槽东华大学软件工程院脑残的实习制度了。学校分配实习公司(全他妈外包公司),不去没学分不能毕业,换实习不行,自己找实习不行。一天给85块钱。去找负责老师谈,老师这么说:

“我们这个实习啊,经过XXX会讨论的。”

“这是学院制度,不能换实习,就是这么规定的,我也没办法。”

“啊?谁规定的?我们开会决定的。这就是制度。”

“你知道嘛?你们还能选实习方向(并不能),人家专业硕士都不能选的,人家还要实习一年多。”

“你这么大了,要懂事。要体谅学校。”

“什么人身攻击?呵呵我从九几年开始教学还第一次有学生说我人身攻击,我的意思不是你不懂事,你怎么能说我人身攻击,我那么多学生都没说过我人身攻击。”

“不行啊不能换啊!我们跟企业有合作的(同谋?)好学生都自己找实习啊那都留下差学生企业不乐意啊(潜台词:找工作好坏不关我事,我要的是所有人都有实习经历,签掉三方合同)。”

这他妈都什么逻辑,什么都是制度。

狗屁东华。

 

Java单例设计模式(Singleton)

面向对象的程序设计中,有时候,我们需要一些对象只有一个,比如线程池(threadpool),缓存(cache),对话框,等等。这些示例也只能有一个,如果有很多个,就会造成数据不统一,资源使用过量的结果。

在Java中,使用“单例设计模式”最简单的方法是:在class中实例化一个对象;将构造函数私有化(没有公开的构造函数,用户就不能再创建另一个对象了);提供通过class获得对象的方法(static)。

另外,如果这个对象比较耗资源,我们在程序中又不一定会用到它的话,那就太浪费了。所以一般我们会在程序用到单例的时候才第一次实例化这个对象。

上面这种实现的方法可能存在的问题是:如果多线程访问,那么对象还没有被实例化之前,可能会有两个线程同时进入getInstance()方法,一下子出来两个对象。

只要对这个方法加上synchronized关键字,就可以轻易地解决这个问题了。synchronized关键字可以保证,每个线程在进入这个方法之前,都必须等其他进程退出。也就是说,不可能同时有两个线程进入这个方法。

这样的确可以解决问题,但是又一个问题来了:性能降低。事实上,我们只需要第一次执行这个方法的时候,才需要同步。设置好单例对象,就不需要同步了,之后每次同步都是一种累赘。这个问题,有以下3个解决方法供参考:

1.如果getInstance()对程序的性能不是很重要,那么……就这样吧,这个方法简单又有效。

2.如果创建示例的代价不是很大,那么可以一开始就创建好示例。这样就可以解决多线程的问题(如此看来,并不是“用到时再创建”就一定好,也要看具体情况,实例化对象代价不大并且需要反复使用,那么就立即创建;如果对象消耗资源大且用到次数不多,再考虑惰性创建)。

3. 用双重检查加锁,先检查实例是否创建,如果未创建,才进入同步代码块创建实例。这样的话,只需要进入同步一次。

关于volatile关键字:volatile修饰的变量,jvm虚拟机保证从主内存加载到线程工作内存的值是最新的

在上面的代码中,用到单例的时候,多个线程可以同时检查是否存在对象,如果存在,以后都不用再进入同步代码了。只有第一次实例化的时候,才需要进入同步。即提高了性能,又节省了空间(惰性创建)。

参考资料:《Head First设计模式》

 

Git的pull和fetch

初学Git的时候,pullfetch让我迷惑了很久,两者都说是从远程分支取回数据到本地分支,今天,总算是搞懂了他们的区别。

fetch

在第一次clone远程仓库的时候,在本地会有一个不可移动的origin/master分支,以及一个可以移动的本地master分支。

18333fig0323-tn

在本地的master工作的时候,本地的master会向前移动,而origin/master是不可以移动的。如上图所示。

git fetch [远程仓库名] /[仓库名]是取回远程分支,更新本地的origin/master分支到最新的位置。这个时候,我们的本地master分支是不变的。如果要得到最新的数据,还要git merge origin/master

18333fig0324-tn

pull

上面提到了,本地的origin/master分支是不可以移动的,如果想要直接在origin/master分支的最新状态上改动,可以在这个地方新开分支,然后在新分支上改动。

从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

所以git pull命令,就是先fetch远程的分支,然后将远程分支合并到本地分支。

在克隆仓库时,Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是 git pushgit pull 一开始就能正常工作的原因。

参考

  1. git-scm 我发现这真是一个好东西,从这里能学到几乎所有用到的git知识。
  2. 我整理的一个git命令速查表:https://gist.github.com/laixintao/81079c85a5e4988f21a918a3af643e47
 

使用iPhone一个月的感受

iPhone 6入手已经一个月了,已经完全适应了iOS。来说说这个月的使用体验吧。

这是我第一部iOS系统的手机,因为价格原因,前面用过的两部手机都是安卓的。在德国的时候我的摩托罗拉1085摔坏了,期间经历了不使用手机的两个月(也没觉得有什么不方便的)。等9月的发布会之后的第二天,打算去南京东路买个iPhone SE。结果那天店员告诉我,SE才降价了300元,iPhone 6S 64G降价了1100元,买iPhone 6S算了,正好那时候兼职做了个网站,有点收入,就入手了。顺便在官方店买了个苹果自家的手机壳,非常喜欢。之前都是不使用手机壳的,这个手机壳给了我比没有壳子还要好的手感。

关于从Android换到iOS,基本上是没有障碍的。不得不说,iOS确实流畅的多,我觉得主要是内存管理的好吧。比如在网上看到说使用第三方的输入法会卡,是因为系统为输入法分配的内存有限,这要是在Android上,输入法都能占内存无法无天,当然会卡了。话说应用打开很快,加上我有5G的流量,所以能用手机的地方我都会用手机,这个月一直在用支付宝,花的现金应该不超过100块吧。

系统功能的可用性相比于Android,要高很多。比如说,屏幕的自动调节亮度,我之前的两部Android手机老是变来变去的,而iPhone几乎让你感受不到屏幕亮度的变化;比如提醒事项和日历,系统的非常好用,所以我没有考虑过第三方的产品。而且配合Siri,有什么事情基本上都不会忘了,顺手就能方便的加到日程里面。哦,Android也有不错的Google日历,觉得不方便的原因大概是因为墙吧!如果没有墙,相信Android的用户体验也能上升一个档次。

image1 image2

付费应用问题,之前在Android上,要付费买个东西简直实在太麻烦了,而盗版的动动手指就能下载下来,所以我没有花心思去买过东西,而换了iPhone的一个月,我已经买了很多精品游戏和app了,之前玩过的Android版的也都买了一些。有一点心理作用,就是花钱买过的游戏比免费的好玩,嘿嘿。应用我买游戏比较多,因为系统的邮件、日历、提醒、相册等都非常棒,能完美地满足我的需求了。

关于用电。我上班和在家都可以充电,所以一般能充电的时候就会插着电源,对电量的要求很低。刚买的时候试了试,正常用下午三点就没电了。

综上,买了iPhone之后,感觉生活质量提高了。你感受不到有个手机的存在,能在无聊的时候看看新闻,玩玩游戏,它掉链子的时候很少,所以不会花你很多精力。

听说Google要出Pixel Phone了,但是在国内不能用还是一大硬伤啊。苹果的在国内限制也比国外多,很多应用国内的商店下载不到,唉。

 

维护了一下博客

最近收到提示,博客的服务器马上就要到期了。

算起来,写博客也三年多了。最初用新浪的博客,后来用了一年godaddy,然后换了台湾的服务器(备案系统太坑了),用了两年。域名换了一次,最开始买的laixintao.com,,觉得名字的域名所有的字母都是占中上格(指的是英文三线),挺好的。一年到期了之后,还没续费,域名被抢注了两年,只要换了一个。不过感觉还是使用kawabangga.com的时候流量多,就用这个吧,还好记一点。

之前,总觉得一下子买几年的是不划算的,因为说不定明年就有个什么云出来,空间一下子就很便宜了。三年过去了,现在续费还是一个价,我已经没有这个想法了。这次就一下子买了三年的,还送了两年。让博客稳定一点,好好写吧。

打开这个博客,发现又变慢了。国内的墙真是反人类啊!Google字体不能用,换上了useso的,今天发现有人说他们服务停掉了,好坑。现在用的是“WP Acceleration for China”插件,换上了新浪的库。

图片虽然加载挺快的,但是我看了看地址,发现不是从七牛那边拉过来的。原来是之前的域名没有配置好,要是今天不发现,说不定还一直耗本站流量呢。

这两个都改了之后,速度果然提升了好多,现在加载最耗时的是disqus评论系统,唉,不得不再吐槽一下墙,真是坑。翻墙没问题,但是不翻墙就可能无法评论。这个没什么办法,我还是喜欢这个评论系统,就这样吧。说不定也可以过滤到一些我不想看到的评论呢,嘿嘿。

博客写到现在,我觉得好处还是挺多的。可以记录下来自己的生活,可以让别人认识自己,可以整理自己的想法,可以学习地更加系统。最近找工作,已经有好几次面试官告诉我说“我看了你的博客,我觉得……”

认真地继续写下去吧。