- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
我和编程语言的爱恨情仇(下)
前言: 《我和编程语言的爱恨情仇(上) 》发布以后,下集久久不出,很多人都抱怨了, 让大家久等了。
这一集主要讲讲我和 Java, Ruby 的故事。 1 赖以谋生的 Java 我第一次听到 Java 是在大学宿舍里, 精瘦的室友躺在上铺在翻一本可能是图书馆借来的 Java 书, 突然间大叫一声“原来 Java 就是虚拟机啊”。
不知道为啥, 这句话对身为微软粉的我刺激颇大, 久久的回荡在脑海里, 引导着我走向 Java 之路。
其实作为备受 C++蹂躏的程序员,第一次来到 Java 世界,感动的简直要哭了:
语法如此简单!
没有指针 !
不用自己管理内存 !
还有强大的内置类库可用啊, 看看这 String 类这么多好用的方法。
还有这完全不用考虑容量大小的 List,Map, Stack 集合框架。
还有这无数开源的小工具,再加上这庞大的生态系统。
作为 Java 程序员, 我感到了做主人的幸福感。
被 Java 打了鸡血以后, 我开始一头扎入《Effective Java》, 《Java 编程思想》,《Java 核心技术》, 《深入 Java 虚拟机》,《expert one-on-one J2EE Development without EJB》等书籍当中。
这一次吸取了 C++的教训, 不仅看书, 还浏览 JUnit 源码,Spring 源码, Hsqldb 源码, Jive 的源码, 再加上工作中写的大量代码, 终于可以得心应手的使用 Java 来编程了。
我最早用 Java 开发 Applet, 对,就是那个运行在浏览器中的小玩意, 但是很快就发现这东西在一个内网里, 让自己人用用还行, 千万不能面向互联网用户。 一是速度慢, 二是丑,加载等待的时候有个巨丑的灰色区域, 用 Java 的 Swing/AWT 写出的界面实在是不敢恭维, 更不要说和那些美轮美奂的 Web 页面相比了。
后来就明白,Java 最适合的还是后端的编程,别让它干那些它不想干,也干不好的事情, 例如桌面编程。
我自己也不太清楚为什么, 对于编写界面好像天生有一种抵触, 也可能是大学自学了一点 photoshop , 把我给吓住了:一点简单的特效都做不出来。
从此明白了做一个好的设计对我这等土包子太难了,那是有艺术细胞的人应该做的事情, 所以我一头扎入了后端的世界, 抛弃了界面,从此乐此不彼。
后端编程不仅仅是 SSH 框架, 还有很多事情需要处理, 像负载均衡,灾难恢复,缓存,消息,分布式,数据备份,搜索等等, 这慢慢的引导着我走向架构之路。
在新技术层出不穷的 IT 业,每天恨不得出现 100 个新框架, 后端的技术相对还是稳定的, 这些知识介于业务层和系统层之间,值得发掘和积累。
有人戏称,用 Java 编程就像穿着西装,正襟危坐,一本正经的敲代码,说的是 Java 语言本身有些“守旧”的传统, 为了保持向后的兼容,牺牲了灵活性。
很多时候你用 Java 解决一个问题,基本上只有那么一种方案, 照着规矩做就是了, 不像 Ruby ,对一个问题有各种解决方案, 有时候得靠项目的约定来规范下。 这么说来 Java 本身的特点也导致了适合大型项目的团队合作开发。
Java 踏准了互联网的浪潮,迅速发展, 让人没想到的是竟然还入侵了移动开发领域, 现在 Java 是第一大编程语言,并且已经保持了很多年了, 语言成熟,工具成熟,社区成熟, 我估计这个势头将来还要继续保持下去。
对我而言,用 Java 做了很多项目以后, 最后变成了赖以谋生的工具,说实话,这个工具真心不错。
2 优雅的 Ruby 2005 年,正沉浸在 Java 的幸福感当中的时候,看到了一篇英文文章, 说的是有个新语言 开发速度是 Java 的 10 倍 , 这简直是当头一棒,我赶紧下载文章并且打印出来,拿回去仔细研读。
这是第一次接触 Ruby, 确切的说是 Ruby on Rails (简称 RoR) 。
由于不懂 Ruby, 文章看起来很吃力, 只是记住了一个命令: scaffold (现在应该不用了), 可以通过一个命令分分钟生成一个 Web 项目的绝大部分 MVC 模板代码, 包括简单的 CRUD 和数据库表的建立, 直接可以运行, 然后码农去修改、补充业务逻辑就可以了。
相比 Java , 既需要把框架搭建起来,还需要埋头写 View 层, 业务逻辑层,数据存取逻辑, 想从头把一个 CRUD 运行起来,颇费一番周折, 显得比较笨拙,比 RoR 的慢好多。
RoR 这种紧密的集成能力是 J2EE 的技术栈相形见绌, 当时流行这么一张图, 非常的形象: 这两本 Ruby 的书就是 《Programming Ruby》,《应用 Rails 进行敏捷 Web 开发》, 非常经典 。
读过以后我才慢慢的体会到了 Ruby 这们动态语言的好处和它惊人的开发效率, 一言蔽之: RoR 总结了 Web 开发领域的一些最佳实践, 简直就是 Web 开发的 DSL(领域特定语言) !
注:限于篇幅,我会专门写一篇文章描述下 DSL, 简单类比的话, SQL 就是对数据库操作的 DSL , 没有 SQL, 码农需要自己直接去读数据库的表,写程序对两个表做关联 join, 有了 SQL ,只需要声明性的告诉数据库:把这个两个表按某某字段 join 起来就可以了
RoR 利用 Ruby 语言近乎“变态”的灵活性, 以及“约定重于配置”这样的实践, 把 Web 开发简化到了极致。
可是动态性是一把双刃剑, 由于缺乏编译器的类型检查, Ruby 的很多错误只能在运行期暴露出来 ,Java 的 IDE (像 Eclipse)提供的重构的能力, Ruby 就很难做到。
在修改 Ruby 代码的时候,似乎又回到了提醒吊胆的时代,生怕代码改动带来意想不到的结果。
由于缺乏静态检查, 只好把运行时检查给写好了,这就是单元测试, 对 Ruby 来说,测试代码量和业务代码量 1 比 1 是非常正常的事情, 有的甚至是 2:1 。
你给我一段没有单元测试的功能代码, 我还真不敢贸然动手去改。
动态语言都有这样的劣势, 但我们主要还是要利用他们的优点,让我们的编程生活更加舒适,不是吗?
有人会说 Ruby 性能不佳,确实是这样,如果把视野放的宽广一点,其实对一个系统来说,性能的瓶颈不再于计算,而在于 IO ,像数据库,网络等。 把架构设计好了,其实 Ruby 系统的整体性能也不错。
我个人非常喜欢 Ruby , 用它写出的代码简洁,优雅,富有表现力。
这是一门能带来乐趣的语言,非常值得学习。
哦对了, 著名的开源云服务平台 Cloud Foundry 就是用 Ruby 写的, IBM 基于 Cloud Foundry 架构了 BlueMix 这个 PaaS 的云服务, 是公司主推的战略产品 , 你看 Ruby 在云端的系统级编程中也有应用啊。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论