【译文贴】Java 界的我转向 Python 的原因

本贴最后更新于 1650 天前,其中的信息可能已经事过景迁

原文作者是在日韩国人 HyunwookPark 先生,最初发表于 Qiita,由 mfabian 转换成中文贴在黑客派
HyunwookPark 先生在大阪经营着一家软件公司,留日 30 年,有 15 年编码经验,在公司上过班也体验过自由职业,曾长期从事 Java 业务编码,也涉猎过微服务、物联网、机器学习、游戏开发等领域,现如今专注于用 Python 做开发。Planaria Inc.是一家从事 Web 应用开发兼编码培训的机构。

关于本文

这是在一次学习讲座上被委托就 Python 发表点意见而整理出来的材料,明明不是很熟悉 Python 这门编码语言,偏偏听众对 Python 的呼声很高。
第一次写这种长文章,行文不连贯的地方还请见谅。

转向用 Python 做开发的契机

满打满算用 Java 有 15 年了,一直很在意 Java 在环境和构建方法上费时间。
本来在小公司接包做开发需要尽快低成本实现,而单单准备构建环境就要花费不菲的成本,觉得很没效率。

全部都用 Java 来实现没有意义

我们技术人员就是要用自己掌握的技术栈来应付眼前的问题。
编码语言的选择对问题的解决有很大影响。
不只限于大型系统的架构,哪怕是简单的功能,也要用现有的开发环境和熟悉的语言来实现。
确实有一定的道理,在 Java 工程师泛滥的今天,我们能够轻松地找到相关技术人员,再者使用统一的技术也有易于维护的一面。
还有,由于使用了静态模型,尽量减少了执行时的报错而被用在大型系统上也算是一个理由。
但是只因为你目前会写 Java 代码而选择用 Java,这有没有道理呢?
仅仅因为你会写,就应该用 Java 来构建客户的系统吗?

即使这样也理应用 Java 来写吗?(我讨厌 Java 的地方)

开发环境复杂

虽然有 ant、maven、gradle 等构建工具,但是由于难懂的定义文件使得系统越庞大就越复杂。
虽然知道是为了解耦的工作机制,但是越解耦就越复杂。
我都干了十几年了,知道现在比 Struts 全盛时期方便很多。
但是项目的全貌并不是容易弄懂的东西。

笨重

对于 Web 应用,当部署 Tomcat 和 Weblogic 等应用到服务器上的时候,依赖库转为 jar 和 war 全部跑到内存上。
在 Java 中实现高并发的场景下,作为单进程来运行就变得很困难。
如果每个进程使用千兆字节大小的内存,即使分批来处理也需要服务器去扛。
在并发级的大型系统中,考虑每个分批的依赖关系,通过执行来减少 jar 依赖这种节省内存的方法也很难办吧。

验证功能实现费时间

哪怕只修改一个地方,就需要花费时间来构建和部署。
很多工程师在实现功能的时候会反复构建、验证,几秒钟到几十秒的构建部署时间累计起来也是不少的工时。
把工时耗在等待的时间上很浪费。
再者这样耗费时间会造成工程师的压力。
展开部署的话会稍微快一点,但是这样就与发布时的状态不一致会导致出现其他问题。

对脚本语言实现方式的期待

想起了以前用 PHP 开发系统时能够快速调试的情况。
如果是脚本语言的话,就可以更顺畅地进行开发了,就是以这个想法为契机开始的。

因此要比较的编码语言就压缩为下面这几种。

  • PHP (脚本语言)
  • JavaScript (脚本语言)
  • Python (脚本语言)
  • Ruby (脚本语言)

各种编码语言的特点(Java 开发者视角)

Java

  • 工作很多(现在是这样)。
  • 大型项目很多。
    • 无法避免派遣。
    • 年轻人避开 Java。
      • 以后年轻的 Java 工程师貌似要减少?
    • 难以培养公司内部人才。
  • 不喜欢包管理工具。
    • ant, maven, gradle
    • jEnv 的话可以吗?
  • 调试麻烦
    • 逐个打 war 包部署。
    • 展开部署倒是还行。

PHP

没毛病。但是。。给人以网页的扩展这样的印象。
除了生成 HTML 以外根本不想用它。
PHP: 全称是 Hypertext Preprocessor 没错吧。
没毛病。。

<?php
// 有点排斥这种代码,这个代码块封闭写法看起来像是HTML元素的逻辑。
?>
  • 写类的时候就像在 JSP 中声明类一样,有违和感。
  • 需要 Scriptlet,有违和感。
  • 标签跟处理混在一起的写法很多。
  • 规范编码的意识薄弱(个人偏见)。
  • “只要能运行就行”式的工程师很多(个人偏见)。
  • 新手好像很容易入门,但是我实在是写得很吃力。
  • 为什么这样呢?报酬低(做的事基本没什么变化)
    • 报酬低所以要速战速决导致各种渣渣
  • 不使用模板引擎吗?
    • 我觉得意识高的人以及在场景需要时才会用。

(附赠)PHP 健在的原因

有 WordPress 这个在 CMS 领域最强大的库。

JavaScript

最初是作为主力候选项。Web 系统的咒缚?虽说是 JavaScript,但是如果熟练掌握它的话就能只用一种编码语言做出 Web 系统来。只是,既不想写也不想读。

  • 制作 Web 应用几乎必不可少的编码语言。
  • 以前用在前端处理上。
  • 老实说很难读,不想写。
  • 通过使用 Node.js 将前后端编码语言统一起来确实非常棒。
    • 擅长通过大量的请求来处理硬件的 I/O。
    • 针对每一个请求都持续占用 CPU 的情况,处理很糟糕。
  • 通过 Electron 可以制作桌面应用。
    • 基于 Chromium 和 Node.js,使用 Web 技术可以制作桌面应用。
    • 实例:Atom(文本编辑器)

Python

现在最喜欢的编码语言。最看中它的易读性。
因为程序员读代码的场景比写代码要多得多。
除此之外,它在现下流行的机器学习领域的优势也很不错。

  • 易读(易维护)
  • 机器学习领域强势。
  • 被选为编码学习的入门语言
    • 在教育领域 Scratch 退休后 Python 接班
  • Linux 标配
    • centos(python 2.7)
    • 极易制作自动化脚本
  • 全球人气爆棚
  • 2018 年项目全在东京(期待 2019 的表现)
  • 没有 switch(这一点有些吃惊)
  • 访问限制薄弱
    • 不加保护
    • 类的私有属性和方法只要写类名就可以调用

Ruby

把 Ruby 作为 Python 的同级别候选项研究了下,越探究越觉得微妙。

  • Rails 真的很棒
  • 多行注释有点微妙
=begin
这是注释吧・・・
这么以为的
用IDE的话,一个快捷键能实现吗?
=end
  • 代码块末尾以 end 闭合很不喜欢
    • 类似 lua 语言的 vb 风格
    • 新手或许觉得这样更容易理解
  • 有段时间拿来跟 Python 比较难以取舍,最后落选
  • 日语博文・书籍很多(日本制造)
    • 其中一个卖点是“日本人发明的编码语言”
  • 只在日本市场使用率很高。
  • 覆盖常量会出现警告。
    • 英语大写字母开头会被当作常量
  • 语法上跟其他编码语言顺序相反 (10.times do |num|)
  • 写法多样(“这样写也可以”的写法很多)
list.times{|num|
  p "test"
}
list.times do |num|
  p "这样的写法也OK"
end
puts "hello"
puts "行尾加分号也可以";
for i in 0..4 do
  puts "for文"
end
for i in 0..4
  puts "do可以省略吗"
end

编码语言比较(Python 视角)

  • 最易读(个人看法)
  • 报酬也很高?
  • 预计往后 10 年会有更多的人用 Python
    • 因为把编码当作基本素养来学习的人正在学习 Python 中。
  • 排名第 1 或者第 2(在脚本语言中毫无疑问排第 1 位)

编码语言排行

那么就来看看编码语言的排行。

编码语言比较

使用 Python 的缺点

  • 速度慢(应该考虑利用 pypy 等来提高速度)
  • 日语博文少(加油)

用 Python 做过的实例

micro web-framework (RESTful framework)

使用 bottle 做的 Web 应用。
数据库使用 SQLite。
前端用 vue.js 实现。

打字游戏

o1.jpg

呼噜呼噜的打字指法游戏这边请

游戏

使用 pygame 做出来的游戏。
为了教小朋友们制作游戏,自己先做出来看看。
按照下面这篇博文的做法实现的。

太空侵略者游戏

o2.jpg

导出数据到 Excel

使用 xlsxwriter 将账单导出到 Excel。

账单

o3.jpg

关于业界动向的思考

Java 开发者以后会减少是?

  • 选择 Java 以后,在大型项目中做苦力的可能性很大
  • 远程工作几乎没有
  • 这类事年轻人避之不及
  • 有必要特意选择费时间的 Java 吗?只用一部分不就行了吗?
    • 想要用 SVF 输出很多账单的话就用 Java
    • 用脚本语言处理速度不够快的时候用 Java?(没有其他好的办法吗?)
    • 其他没想到的点

(顺便说一下)新手当中用 Ruby 的人很多

  • 因为日语文档很多,所以给人以看起来很容易的印象?
  • 因为不用写 SQL 也可以?(有 Rails)
  • 制作 Web 应用很容易?(有 Rails)

因为 Rails 很棒,所以才使用 Ruby 的感觉。

Web 系统的今后发展(个人看法)

  • 快速制作的话用脚本语言
    • 特别是做微服务
  • 全球流行的 Python 热估计也会来到日本
    • 东京的流行趋势会晚一年传到大阪来(个人主观意见)
  • 在从事 Java 和 Ruby 开发的话以后会有忧虑
  • Go 语言应该会追上来
  • Python 跟 Go 语言有可能成为两强

编码语言技术一览

PHP 跟 Ruby 的信息太少请见谅 (编者注:原文评论中有网友补充了关于 Ruby 和 PHP 的信息,作者采纳修改后故将这句话加了删除线效果)
已按评论中的指导意见做了补充,感谢各位的建言。

- PHP Python Ruby Java
CMS WordPress, Drupal Mezzanine, django-cms Refinery, 島根県 CMS,浄瑠璃, ぞめき,白鷺 Liferay
Web Framework Laravel, CakePHP django, Bottle, Flask Rails, Sinatra Play, Jersey, Spring
package manager composer pip, Pipenv gem maven, gradle
IDE PhpStorm PyCharm 哪个比较有名? Eclipse
code checker PHPStan pycodestyle, autopep8 哪个比较有名? CheckStyle(in Eclipse)

仍然是 Python 新手,关于“Python 怎么样?”的看法。

因为才刚开始使用 Python,所以有成堆的搞不清楚的问题。

  • 包的管理很简单?
    • python 也能使用 nexus 吗?
    • 现在流行的 Yarn 是 Pipenv?
    • 总觉得 Anaconda 的用途不同
      • 明明是要创建 Web 应用的开发环境,要安装 Anaconda 吗?
  • 用哪个 IDE 好呢?(现在使用 Atom 实操)
    • PyCharm
      • 每月 $8.90 (至少 1,000 日元)
      • 是因为能在 Django 中下断点的缘故吗?
    • Jupyter
    • Wing
    • PyScripter
    • Eclipse(导入 PyDev 插件)
      • 启动居然需要 Java 环境,讨厌。
  • 日志输出有什么好处吗?
  • 内存使用情况如何?
  • Django,Bottle,Flask 等等,事件是线程?
  • 编码规范检查器是这些?
    • pep8 → 好像变成了 pycodestyle
    • pep257 → 好像变成了 pydocstyle
    • yapf
    • autopep8
    • pyflakes

其他在意的编码语言

Go 语言

  • 速度快!
  • 结构体・使用指针
  • 多线程强悍
  • 学习成本高(跟 C 语言并列)

擅自评分表(满分 5 分)

※加入了其他在意的 Go 语言

- Python Ruby PHP Java Go 备注
运行速度 3 1 3 5 5 Go 语言的速度跟 Java 并列?
代码可读性 5 4 1 3 3 Python 代码易读,PHP 代码根本不想维护好吗
学习难易度 5 4 4 3 2 Go 语言稍微有点难
面向对象 3 5 4 5 2 纯面向对象的话是 Ruby。Go 语言是结构体。
机器学习 5 2 2 3 2 除了 Python 之外就是 R 语言
全球人气排行 5 2 4 5 3 Go 语言极速飙升中。
日本人气排行 2 4 5 5 1 日本市场还是打算使用 PHP 的样子。
年收入 4 3 1 4 5 机器学习的项目收入高。Python 跟 Go 语言的 Web 项目很少。
项目区域 都在东京 都在东京 大阪也有 大阪也有 都在东京 大阪没有用新技术的动力。
分数统计 32 25 24 33 23 并不是简单统计分数就能做出判断,而是作为一个参照指标来看。

总结

  1. 从热门度来看,Java 程序员接下来应该选择的编码语言毫无疑问是 Python
    • Java 已经会用了,所以只在需要用 Java 的场合才用 Java
    • 如果要选择第二编码语言的话应该是 Python 吧。
  2. 使用原生的 Python 速度不够快
    • 期待 pypy 的表现
  3. 目前 Ruby 在日本市场很热门,但是如果没有 Rails 的话价值就会减半,所以很微妙
    • 乘着周遭同行都在盯着 Ruby 的时候发力甩开他们吧(我是这么想的)
  4. 在 CMS 领域无法战胜 WordPress 吗?
    • 如果诞生出用 Python 实现的极赞 CMS,毫无疑问 Python 在 Web 领域也会成为 No.1
  5. 考虑到开发速度,Ruby 作为一个可选项
  6. 最终理应变成“不是选择某一门技术,而是要做技术选型”这样吗?

原文链接:https://qiita.com/HyunwookPark/items/68d029dd33807fc69ca4

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 176 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
5 操作
soulfight 在 2019-10-13 13:01:26 更新了该帖
soulfight 在 2019-09-30 11:34:23 更新了该帖
soulfight 在 2019-09-30 11:33:17 更新了该帖
soulfight 在 2019-09-30 10:38:10 更新了该帖 soulfight 在 2019-09-25 22:27:56 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...