Tag Archives: Java

不要技术自嗨

  去年看到一篇报道,讲一个创业团队先用C++开发一个大数据产品,然后又换成RUST花了半年重写一遍。理由仅仅是对语言的偏好。我回复了几句:“成熟的技术创业者选Java做主语言,不是不懂其他时髦语言,而是因为国内Java工程师的招聘和工资成本明显低于其他语言。技术领导者不能技术自嗨,要在更高层面思考,比如看看公司现金流,算算最坏情况能撑多久。做真正正确的决策。”

编程语言

  最近又在上海、杭州……到处飞。在飞机上用大黄蜂看了好多电影。

  网上总有编程语言的讨论,以及公司和团队用哪种语言不用哪种语言的议论。我刚刚在42qu上回复一个帖子,对此作了一些评论:

     java和python无所谓好坏,只在于团队合适哪个。如果工作中不能用,自己找时间自学不也很好吗?

     算了算,我曾拿来实际挣过钱的编程语言有11种,编程超过万行的有5种。其中很多最初都源于私人兴趣,拿来摆弄玩,后来工作中有合适机会就用上了。工具总是会换来换去不断演进,如何使用它们做出好产品更重要一些。

     招聘和技术方案选型总有各种考虑。如果是较平常的项目,大公司常选用主流编程语言以降低人力成本。反过来,很多极客文化较浓的创业团队最初青睐python,或者lisp,或者go,或者其他某种奇怪的编程语言,往往并非这种语言本身比Java和C++牛。而在于,熟悉小众语言(不过现在python也不算小众了)是个明显特征,意味着这个程序员有好奇心、不怕变化、喜欢私下主动踅摸技术、对编程有兴趣、有能力独立解决问题。

  帮教主宣传一下。他的python网站培训班又开始报名了,里面大量动手环节,有兴趣的去看看吧。

Do it yourself

  正在指导zk和wl在超龙一号超级计算机上安装配置pFind集群版。打算在960核情况下做一些加速比试验。和上次1024核试验很类似。很遗憾不能在龙芯CPU的节点上玩玩。

  哪吒系统在集群上全流程各环节并行。我一开始指望用点python有关的分布式并行框架,最后还是DIY。小马过河,有些地方挺困难(例如对虚拟机的管理和通讯),但总体来看,其实比想象简单。

  前几天提到,新版pFind核心使用了二级离子索引,但引入HBase不顺利。又发了些邮件开了些会,终于下定决心对查询部分推倒重来,抛开Hadoop等现有框架从头实现。方案确定,大家恍然大悟:原本就该这样做,花了半年证明HBase不行啊。

  上次BLOG最后写:“Java和C#逐渐不那么招人喜欢”,还链接了“Why do some people hate Java?"“Why we don’t hire .NET programmers”两篇文字,引来不少邮件和评论。俺的不少好友是Java和C#高手,并不想挑起语言口水战。那段文字也只是描述现象。具体从风格而言,这两种语言都是以“减少新手犯愚蠢错误”作为第一原则的,对初学者相当友好。不过也有点像乐高玩具,常规情况下简单易用,但面对更高的要求时(运行效率、开发效率等等方面),就不得不去了解大量水面以下的细节。相比起来,开源界的技术栈常常是哭着进去笑着出来。

Dennis Ritchie去世,还有一段个人记忆

  首先,C语言之父Dennis Ritchie去世,默哀。大家可以回顾一下这篇2000年的新闻稿,记者专访了C、C++和Java三种语言的创始人。C++11标准终于发布了,ISO C11新版也会马上发布。C标准委员会和C++标准委员会关系很好,有很多成员在两边兼任,所以相互协同越来越好。只可惜,自从SUN被收购,眼看着Java要被Oracle生生折腾死了。

  OK,技术写完了。

  前两天收到好朋友的消息,说我的BLOG上长篇大论的技术review越来越多,鲜活的个人体验越来越少。朋友提醒我,不要被点击量和搜索排名绑架,不要忘记那些关注你个人的好朋友们。说得对,BLOG之所以不同于其他媒体,在于其背后是个活人,有喜怒哀乐和碎碎念。订阅者若是只关心宏大严肃的话题,就去看《南方周末》了。

  下面是一段无关技术的记忆,分享给关心我的好友,也分享给上岁数以后的自己。

  战争,窗户外面轰炸机正在扔炸弹,火红的爆炸和灰滚滚的尘土,小区里的楼开始摇晃歪倒,多米诺骨牌,一栋、两栋……终于轮到我这一栋楼了,卧倒,地板逐渐倾斜,周围充满了邻居们的叫喊……

  女儿的抽泣把我从梦里拽出来。睁开眼睛,小婴儿正在吭叽,努力试图侧过身子,离妈妈近一点。妻子还在睡梦里,一只手揽着孩子,胳膊肘顶着我的肩膀,哦,是怕我梦里翻身会不小心压到孩子。

  女儿不懈挣扎,用脚踢被子,发出更大声音的抗议……妻子很快醒了,侧过身给孩子喂奶。孩子急躁地叫起来,妈妈温柔而疲惫地安慰,然后就是小家伙咕噜咕噜吃奶的声音。

  给女儿盖上被子,问“换尿布吗?”,妻子说“不用,你睡吧”。

  卫生间里的冷光夜灯透过来,描出母女两个的轮廓来,像大理石雕塑。翻身,裹好被子,深呼吸,安详温暖的气氛,刚才噩梦里的紧张纠结已经很远很淡了。困倦,接着睡……

  补:教主说,闭上眼,且听风吟;这一刻,世界与我无关。

Agile的JFox,Pragmatic的JFox

  昨天allen发了一篇BLOG:Agile J2EE、IoC、AOP : JFox的发展策略。明确提出JFox的新定位:Agile J2EE Application Server。也就是说,侧重于IoC,AOP技术,有选择性地支持EJB标准,放弃类似Entity Bean这样复杂而不实用的部分。

  很赞同这种明确实用的策略。提些小建议:

  1. 确 保固定的发布周期,短一些。最好每月一个milestone版,半年一个final版。人手不够?步子可以迈小一点;变化?把部分feature推迟到下 一版……无论如何,版本发布的频率节奏一定要稳定,周期要短。这是很多成功的开源项目的经验,也是Agile最重要的原则之一。
  2. 建立一个子项目,专门用于集成实用的示范应用,演示JFox推荐的体系结构、设计模式用法。这些示范应用必须是实际的完整的解决方案,而不是Hello World式的Demo。用户可以在此基础上修改扩充,形成自己的系统。Pragmatic的开发框架对推广很重要。

C++和集群系统

  现代C++的发展方向让人困惑:泛型技术的确很酷,却妨碍了模块的动态链接。没有Java Bean这样的标准组件模型可能算是C++语言最让人头疼的地方,程序员被各种编译器和操作系统的细节淹没。

  大型系统里,C++到底负责哪些部分更合适?时髦的体系结构是这样的:用C++实现library层,用Java甚至更华丽的动态语言实现业务层和界面层。看起来很美,比如Eclipse和SWT

  串联质谱鉴定系统搜索引擎pFind以外的模块如何组织?一直拿不定主意。

  上周去合作单位,实际操作同类的国外工业级产品,集群系统的体系结构给我留下了深刻印象:由C++实现各种独立的后台服务,无论命令行、Java GUI界面、分布式网络协议或Web界面方式,都能操作这些服务进程。的确是简明漂亮的方式。

  好的解决方案往往都很简单。比如集群节点间的通讯服务,其实只需相互交换简单的消息,再利用NETBIOSNFS共享具体数据就行了。