Kotin 不错,但它只不过是C#的模仿者
简介
kotlin 是不是最近很火热,有Google爸爸的加持之下, 感觉Kotlin如日中天?
很抱歉, 其实从一个开发人员的眼界里来看, Kotlin其实真的没有那么牛逼,可能是有一点过誉了.
它本质上,还是在模仿C#, 而C# 甚至还有LINQ这样牛逼的特性 . 更不用说现在.net已经开源, 免费使用. C#还有自己独立的VM, kotlin还没有自己的运行时, 它还只能依附于JVM生态上吸血.
我个人其实觉得Jetbrains公司, 没有自己的VM, 而又不积极去推进JVM生态体系建设,反而自己自立门户,这样的手段,感觉到不是很光彩.
我是正统Java, JDK,JVM的坚定支持者.
Kotlin 跟C# 到底有多像?
# Kotlin
println("Hello, world!")
#C#
public void Main()
{
Console.WriteLine("Hello, world!");
}
----
# Kotlin
var myVariable = 42
myVariable = 50
val myConstant = 42
# C#
var myVariable = 42;
myVariable = 50;
----
# Kotlin
val age = 42
if (age < 10) {
println("You're too young to watch this movie")
} else if (age < 13) {
println("You can watch this movie with a parent")
} else {
println("You can watch this movie")
}
# C#
var age = 42;
if (age < 10)
{
Console.WriteLine("You're too young to watch this movie");
}
else if (age < 13)
{
Console.WriteLine("You can watch this movie with a parent");
}
else
{
Console.WriteLine("You can watch this movie");
}
----
# Kotlin
fun greet(name: String, day: String): String {
return "Hello $name, today is $day."
}
val text = greet("Bob", "Tuesday")
// Hello Bob, today is Tuesday
# C#
string Greet(string name, string day)
{
return $"Hello {name}, today is {day}";
}
var text = Greet("Bob", "Tuesday");
// Hello Bob, today is Tuesday
----
# Kotlin
fun transform(initial: String, f: (String) -> String) = f(initial)
val result = transform("hello", { x -> x.toUpperCase() })
// Trailing lambda can be placed outside the parentheses
val result2 = transform("hello") { x -> x.toUpperCase() }
// HELLO
# C#
string Transform(string initial, Func<string, string> f) => f(initial);
var result = Transform("hello", x => x.ToUpper());
// HELLO
----
# Kotlin
// Kotlin doesn't have tuples, use data classes
data class GasPrices(val a: Double, val b: Double, val c: Double)
fun getGasPrices() = GasPrices(3.59, 3.69, 3.79)
val prices = getGasPrices();
val (a, b, c) = getGasPrices();
# C#
(double a, double b, double c) GetGasPrices() => (3.59, 3.69, 3.79);
var result = GetGasPrices();
var (a, b, c) = GetGasPrices();
你 可能会觉得, Kotlin我是独立设计的,说什么抄袭呢? 你要知道, C# 现在已经出来第9代了.
这些理念和设计, kotlin 落后了一二十年才出来. 你踩着前人走过的坑,继续踩一遍,你还好意思说自己原创?
编程语言,如果说跟咱们武林门派相比: 武当派咱就是C#, Java那就是少林派. Kotlin, 那就星宿派吧.
武当少林, 都是武林中大门派, 开宗立派, 山门打开, 广收门徒,受万人敬仰.
Kotlin 的问题 在于什么:
- 它目前还是一个商业公司独裁的研发状态, 核心Leader是Jetbrains 的团队leader
- 它的特性研发, 都是官方掌控,官方贴一个设计文档,然后就这么撸了, 你没有办法阻止它,或者让它干什么
- 迭代演进太快了, 跟前端技术一样,一个星期能给你几个迭代出来. 过了一两个月,你就完全懵逼, 瞎叽霸改什么玩意?
- 抄袭其他语言的特点比较多, 但是没有抄到精髓, 学,而不像, 画虎不成反似猫.
- 设计能力很差, 没有其他语言那种能画龙点睛,令人叹为观止的设计
- 没有解决业务开发的问题, 反而制造更多问题, 为了解决设计的问题,又强行加戏,带来更多的问题
- 最终坑害的是学这个语言,并试图把这个语言投产的 开发者, 公司
- 未来不明显,不明确, 没有加入一个能够持续发展的开源基金会, 哪怕是Apache, Eclipse,Linux 基金会, CNCF等任何一家
- 官方对开发者,社区,扶持力度不够, 对开发者需要的生态,支持力度不够,
- 对上游JVM,JDK 索取多, 回馈少. 作为一门依赖于JDK体系的语言, 你闷头发展自己的技术,而不想着回馈给上游,我就觉得你这个项目,没有那么伟大
给所有喜欢Kotlin的开发者,一个忠告:
- 如果你是为了吃饭, 那么Java 永远是你可以信赖的伙伴,它有着严谨的开发,技术规范,不会随便折腾. 大企业,生态体系都不会乱来, 稳定,可控
- 如果你不怕, 那么不要随便升级最新的kotlin , 因为新版小白鼠没有那么多, 上车快,意味着bug多, 不稳定的因素多. 生产环境最怕什么,最怕 各种奇葩的问题. 而且你不是kotlin核心团队,很多奇怪的问题,定位,修起来不是那么好修, 你不得不退回之前一个稳定的版本,而为了找到一个稳定的版本,你会需要花更多的精力去定位问题, 测试问题
- 如果有能力, 请关注kotlin的开发进展, 对他们的特性增加,减少,废弃特性, 提出自己的意见,建议, 也让他们知道, 社区是有意见,建议的, 他们不可以为所欲为.随便乱改
- 如果有能力, 也请多支持, 比如贡献开源类库, 帮助建设kotlin生态体系, 现在Kotlin生态体系还很薄弱, 类库支持还比较少一些, 当然,可以调用java原生的lib,但是kotlin自己的生态不是那么完善.
对于那些犹豫不决的开发者, 我觉得大家可以考虑下更成熟后的语言. 比如C#, Java, 如果你公司业务没这么庞大, 那么PHP, Ruby on Rails, Python 也可以考虑考虑.
移动端开发,选择就没那么多, 老实本分的 Java其实挺好的. 我觉得Java 8 可以再写个二十年.
只要谷歌脑子不抽风, 我觉得都挺好的.
预测一下稳定的 Kotlin, 估计要等到3代以后, 期待kotlin 3. 因为这第一代的kotlin, 老实说,很多设计都是非常仓促, 问题是比较多的. 官方的更新迭代也是非常剧烈
完全是出于一个失控的状态.
学kotlin的这几年,吃尽了不少苦头, 也有了这篇文章. 好了, 我该说的都说完了, kotlin的铁粉们,可以来喷我了.
如果你们没有被kotlin 殴打过, 别告诉我你是kotlin 的铁粉.
没有踩过十次以上坑的, 别来跟我说你更懂kotlin, 因为你连kotlin的门都没摸到, 还不知道它有哪些不足, 发展过程中, 有哪些坑.