在过去的20年里,软件开发领域发生了多大的变化?

PySpa是一个集成思念体的工具。

在某个聊天群中,有人提起了一个话题:“现在有没有写了关于现代OSS项目管理最佳实践的书?因为这方面的知识更新很快,不会陈旧过时吧。”我回答说,我记得有《Expert Python Programming》和《Python Professional Programming》这两本书可以推荐。但是其他人也提到了《Ship It》、《Manage It》、《Release It》这三部作品,还有《达人程序员》等等。

沿溯这一地区的源头,顺带一提,现在流行的开发源头很多都继承了极限编程开发系的实践基因。顺带一提,从当时看来,现在有什么样的变化呢,这是一个话题。既然机会难得,我会顺便回忆起20年前,试着总结一下当时和现在的变化情况。

20年前的情况

当XP白皮书问世时,我们一起兴致勃勃地阅读它,或在邮件列表上热烈地讨论。

    • Java: JDK 1.2 (HotSpot VMが初搭載)

 

    • C++: C++98だけど、Visual C++ 6.0とかEGCSが統合されたGCC 2.95が出てた頃。C++ Builder 3とか、Borland C++ 5とか。

 

    • Python: 1.5

 

    • Ruby: 1.3

 

    ブラウザ: Internet Explorer 5, Netscape Navigator 4.5。IEの方が安定していたかな?

各个领域的变化

编程

设计模式

当时,GoF的设计模式非常流行,学习它可以证明我们具备了无论使用何种编程语言都能掌握的设计能力,给人一种中学二年级的感觉。

然而,在编程的核心领域中,像NullObject模式、流畅接口、MVVM,最近出现的Flux、Clean Architecture、Onion Architecture等几乎是唯一普及为术语的设计模式。虽然还存在一些被提出用于使代码更接近设计模式的方法论,也有大量类似XX模式的涌现,以及试图将其应用于其他领域的动向,但我认为设计模式本身并没有得到显著的发展。

最近很流行的一种编程风格就是采用函数式编程的精髓。有很多语言都支持forEach/map/filter/reduce等函数。这些函数能够接收函数作为实际处理部分,因此称为高阶函数。可以用它们来进行列表处理。此外,还流行使用无状态且以不可变方式处理数据(不是直接更改值,而是创建一个新世界来代替之前的世界)。另一方面,尾递归和模式匹配仍然需要编程语言的支持,还没有得到普及。

类型

在那个时候,完全就只有两个选择。

    • 型を書く:コンパイルでチェックされるがだるいしコンパイル遅い

 

    型を書かない:コンパイルなくてこまめに実行できるが、チェックが何もないのでテストを余計に書かないといけない

现在,随着类型推断应用于各种编程语言中,能够减少编写类型的次数并进行检查的便利性也增加了。开发环境也变得更加智能化,配合个人电脑性能的提升,实时检查也变得实用起来了。

    • JavaScriptもTypeScript/flowtypeで型を使うブーム。Pythonもmypy導入。Rubyも導入を検討

 

    JavaもC++も、右辺で型が決まるならvar/autoで省略できるようになってだいぶ楽に

生态系统

以前,我记得我们需要逐个下载依赖库并进行编译安装,大概就是那样的感觉。但是现在我们可以从软件包仓库中一次性下载并批量安装,这样更加便捷。上传也更加容易,更自由了。嗯,虽然这种方式早在20年前的CTAN(用于TeX)发布之后,CPAN(用于Perl)就开始模仿了…这种方式在其他语言中也被广泛采用。

在其中可以看到一种趋势,即选择语言→选择生态系统→再次选择语言。语言变得流行→库变得丰富→想要使用这些库,但不想使用该语言,因此就诞生了使用该生态系统的语言→原始语言被吸引并得到发展→最终趋于原始语言的一致性…类似这样的情况。

当Java变得流行时,出现了诸如Groovy、Jython和JRuby等各种JVM语言,但是Java本身也不断吸纳了其他语言的特性并变得更强大,所以最终使用Java就可以了,因为有很多示例可用,给人一种这样的感觉。至于Kotlin,由于涉及到不同的政治因素,就不提了。JavaScript方面,从JSX(DeNA的)和CoffeeScript发展到JavaScript(+TypeScript)。与像Silverlight一样的编程自由相比,更注重stackoverflow的可用性,也就是说,复制粘贴的能力胜出了吗?

应用程序的形式

以前,桌面电脑很常见。虽然互联网也开始兴起,但主要以CGI为核心,而J2EE则在即将兴起。当时还听到了LAMP(Linux、Apache、MySQL、PHP)堆栈这样的词语。

现在几乎全是网络和手机。台式机只剩下一些古老的顽固分子。

單元測試

    • 各フレームワークの使い勝手はだいぶ良くなったように感じるが、基本的にはそこまで変わっていない。

 

    • ビヘイビア駆動開発の流れを受けたフレームワークは増えた。RSpecとかJS系とかで特に。

 

    • 外部I/Oのライブラリが自らモック用のクラスを準備してくれたりとか、ライブラリの補助は増えている。

 

    • テストの基本の書き方は特に変化はないが、テーブルベーステストがGoとかPythonとかJavaScriptとかいろいろ広がっているのを感じる。

 

    • プロパティベーステストが次の流れに乗れるかどうか。

 

    当時はt-wadaさんはDBの人というイメージで、まだテストの人というイメージではなかった。

端到端测试(End-to-End测试)

    • デスクトップが主体だった。

昔は話題に上がるのはFitnesse(Java)ぐらい
QtはFrogLogic社のツールとかは昔からあったきがするけどめちゃ高かった
構造的にGUIのメッセージ処理とかに食い込む機構だったのでフレームワークごとに固有のツール。
とはいえ、このあたりの取り組みが今のRPAにつながっている気がしないでもない

今はウェブとモバイル

Seleniumから出発し、Appiumとかいろいろある。
モバイルは最初からこのあたりに取り組む人が増えてきた
Chrome自身もHeadlessとかCDPとかいろいろ装備してプログラマブルに利用することができるように

连续性连接 (CI)

当时流行的是Hudson(Jenkins)和buildout。有资金、有赞助的地方会在本地部署大量服务器,同时进行Windows/Linux/FreeBSD/Solaris/HP-UX等并行构建,效果非常酷炫。

最近,SaaS服务种类繁多,门槛大大降低。并且出现了免费的OSS开发支持计划,成为许多人普遍可用的选择。

    • 各言語が提供するビルドツールとかもだいぶ使い勝手が良くなってきました。

 

    • Dockerコンテナも出てきてブームに。アプリケーション作るだけではなく、Dockerfileビルド時間短縮芸とか、イメージサイズ縮小eスポーツが流行っています。

 

    大規模インフラ構築はopenStackで新たな市場ができあがり、K8sが今後は普及の兆しだけど、今も昔も、みんな難しい・・・と言っている。

代码共同所有 (Code joint ownership)

这里是我感觉改变最大的地方。

当时的主流是CVS和VSS。

    • VSSはWindowsのフォルダ共有で運用できたので敷居は低かったし、Visual Studioの有料版にはバンドルされていたので、新規投資なしで使えた(はず)

 

    • OSSでは、SourceForge.net(日本ではなくて)にアカウントがあって、CVSを扱うのがステータス。

 

    • この時点ではまだ流行っていなかったのがSVN。2002年リリースのTortiseSVNは使いやすいしわかりやすい。変更の多いバイナリを扱う場合だと未だにGitよりも良いこともある。

 

    ブランチなにそれ?

现在Git统治着。

    • GitHubとかGitLabとかSaaSサービスが大きく普及し、気軽に使えるように。GitHub採用なる言葉も

 

    • 社内でもGitHub Enterprise ServerとかGitLab Communityを運用する会社も増えた

 

    • ブランチを使った運用、Pull Requestを使った運用とか。当たり前のようにフォークして、Pull Requestを出して、それがGitHub上でCIが走ってチェックされて、diffをわかりやすい画面で見てブラウザでマージ。

 

    • GoとかNode.jsとかGit上のパッケージを直接取得してくる言語とかも後押し

 

    MercurialとBazaarにはもう少し頑張って欲しかった。

此外,對於共有代碼的範疇我不太了解,但使用docker-compose.yml文件一鍵啟動開發環境或共同擁有開發環境信息這種功能非常方便。多虧了VMWare、OpenStack、Docker、Ansible等各種技術的努力,便利性大大增加。基礎架構已經成為雲端,環境也變成了基礎架構代碼,並開始被稱為基礎架構即代碼(IaC),這些形式也有了很大的改變。

如果现在要创建敏捷实践,那么肯定会涉及到基础设施的讨论。

重构

    • もちろん本来はテストを書いてからがんばって実行しましょうなんだけど、モリッとやってくれるIDEの機能もだいぶ便利に。

 

    デザインパターンの議論があまり行われなくなって、それにともなって新しいムーブメントがなくて寂しいと感じる。

编码规范

    • 昔はコーディング規約を決めて、各自頑張ってそれを守ろう、という感じでした。

 

    • Eclipseみたいな気の利いたツールがフォーマッターを内蔵しはじめました

 

    • 今やフォーマットは自動で修正すべき、みたいになってきている。便利なツールが増えた(go fmt/prettier/black etc)

 

    コード共同所有+SaaSのリポジトリの普及で、diffを見てPRをマージみたいなのが主流になってきたり、余計なdiffを減らして見やすくするという必然性が高まったのかもしれません。

文件

    • JavaDocとかDoxygenを一生懸命書いてHTMLやらWindowsヘルプを生成みたいな感じでした。

JavaDocの普及により、ソースコード内に決まった文法で書いてドキュメント生成は市民権を得ました。

ウェブサイトに公開する目的では今もあるが、ローカルはエディタがポップアップで出してくれるのが多くて、手元でビルドして使う人はあまりいないのでは?
当時はWikiブームみたいなのが少しきていた。文法は増え続け、収束することはなかった。n種類あるWiki文法を統一させよう!という意欲的なCreoleという文法が出てきたけど、n+1種類になっただけであった。
みんなMarkdown書くようになった。方言は増え続け、収束させようと努力する人はいるものの、収束する雰囲気はない。
モデル駆動開発とか、CASEツールとかは当時は夢があったけど最近は話をしている人はいない。Rational Rose欲しかったんだよな。昔。
UML!!UML!!という感じもなくなった。

记录

    • DEBUG/INFO/WARN/ERROR/FATALみたいなのは変わっていない

 

    • ウェブサービスの入り口では全部ログを出しておけ、Hadoopで分析だ、みたいなのはソシャゲブーム前後でだいぶ流行った。今はBigQueryとか集約側はSaaSとかがいろいろ便利に。いわゆるビッグデータブーム。

 

    • syslogとかでローカルに→fluentdとかのログコレクターを使う方法が一般化→それはコンテナのサイドカーでやるからアプリは標準出力に出しておけ、みたいな寄り戻しが来ている雰囲気。

 

    • これとは別に、オブザーバビリティ(分散トレースとかメトリックスのモニタリング)は当時はなかったが、最近は少しずつ名前を聞くようになってきた(個人的にはCouchDB使って分散トレースはやっていたけども)。

 

    ビッグデータは運用改善とかA/Bテストとかお金の匂いがする感じであったけど、オブザーバビリティは純粋に開発とか運用改善みたいな雰囲気。オブザーバビリティは今後の基礎教養になりそう。

数据库

    • 当時はRDBがコア。RDBの入出力をJavaなどで書くのがメイン。

OSSのDBはまだあまり第一線で使われることはなく、Oracle/DB2/SQL Server/Interbase(Firebird)などが広く使われていた。
Oracleも1コアならライセンス料が安い!

最初はNoSQLという名前で話題になった非RDB群も、現在では用途別に少しずつ普及してきた。

memcached、Redisなど、特定用途特化のキャッシュとかランキングとかのKVSが使われるように
検索エンジンとしてElasticsearchを一緒に使うようになってきた
日本では流行ってないけど、リレーションまでは不要で親子関係でJSONで表現できる範囲(プレイヤーのアイテムプロパティにアイテムが3個入って・・・とか)であればMongoDBは海外では流行っている。
Dynamo, BigTableも用途によっては使われるが、消えたら困るようなメインのDBは日本ではまだまだRDBが強い。
NoSQLといっても、主キーで値をとってくる以上の機能を備えたものは独自の記述力の高いクエリー言語を持っていたり(MongoDBのJSONのクエリー、CassandraのCQL)するし、それをもうSQLにしちゃえばよくね?(Spanner、CockroachDB)みたいなのも出てきて、NoSQLという言葉自体が使われなくなってきてる?
クラウドパワーで、Kafkaをそのままストレージに使うLinkedInみたいな変態アーキテクチャも

RDBもだいぶ世界が変わって来た

現在はOSSのRDBMS(というかPostgreSQLとMySQL)がかなり使われるようになってきた
RDBもクラウドのパワーを得た

MySQL/PostgreSQLのエンジンが切り替えられるクラウドサービスを各クラウドベンダーが提供
スケーラビリティが重視される場合はAurora、Spanner、CosmosDBなどの分散するRDBも人気
とはいえ、エクサデータは相変わらずすごい。札束ですべてが解決する。マネーイズパワー。

总结。

基本向量的本质并没有太大的变化,但工具的使用便捷性和覆盖率显著增强,同时为了让任何人都能够方便使用,维护也变得非常简单。在过去,“在看到像IBM和Microsoft等一些公司拥有丰富的工程资源和盈利情况时,我曾经羡慕不已”,而现在能够轻松使用的情况已经发生了巨大变化。

我认为,除了分布式版本控制系统Git的普及和其周边生态系统的变化外,开发体验也发生了很大的变化。

bannerAds