清华大学硕士分享:Java、Python与JavaScript开发经验,新手入门首选Java
我毕业于清华大学,获硕士学位。我在北京写了两年Java,在杭州写了三年Python。深度定制了Python虚拟机,现在从事arm上JavaScript虚拟机的开发。虽然我还不是一个伟大的人,但我觉得我的经历可以为大多数新从业者提供参考。

这三者中,最推荐的是Java。真的,Python当然好,但是对于一个新手来说,最重要的是先找到工作吧?说到找工作,Java无疑是最容易的。对于跨行业的人来说,最困难的其实是第一步,就是如何进入这个行业。如果连第一份工作都进不去,那就努力工作,弥补数据结构、设计模式、算法设计方面的差距。这是不可能谈论的,对吧?
不要被学术背景的说法吓倒。虽然我是科班出来的,但我总觉得只要努力,就没有不可逾越的差距。最重要的是不要目标太高或太急于求成。有一个学习和积累的过程。在程序员这个职业中,你的每一份努力都会得到一些回报。尊重学习的内在规律,循序渐进。有一天,你会成为你想成为的人。
下面我来说说具体的计划。
1.了解Java的运行环境。了解路径和类路径的作用,以及如何在命令行上编译和执行它们。了解 IDE 按钮背后到底发生了什么。
2.掌握Java语法。了解包、接口、类和继承的基本概念。掌握多态、重写,记忆IO接口,包括InputStream/OutputStream和Writer/Reader,记忆网络编程和GUI编程接口,记忆JDBC接口。对于这一步,推荐的书是《Thinking in Java》。
3.掌握多线程编程。了解ConcurrencyHashMap是如何实现的,什么是synchronized,以及为什么有Runnable接口。
当你掌握了第二步和第三步的80%时,你就可以考虑找工作了。
4.在工作中体验设计模式。我推荐《Java与模式》这本书。读完里面的Decorator和IO接口,你就再也不会死记硬背了。使用时,根据Adapter和Decorator的命名规则,可以暂时推断出来。
5、数据结构补得不好。了解LinkedList和ArrayList的实现机制,了解其各个接口的时间复杂度。还有其他容器,Map、Set,它们都是一样的。堆栈、队列、二叉树和图在整个编程过程中都会用到。如果你走不出这一步,你就只能做一个底层程序员了。
6、如果可能的话,最好涉足一些算法设计。比如动态规则的思想、贪心算法、KMP等奇葩算法等等。这一步并不像数据结构那么重要。学好固然好,但学不好也不要太沮丧。
此时,你和专业程序员的差距就没有那么大了。您现在可以在工作中独立承担开发任务。
7.高级,现在你可以有自己的想法了。 Java发展至今,应用于多种场景。毫不夸张地说,它是使用最广泛的编程语言。基础打好了之后,你就可以考虑往哪个方向发展了。比如服务器端架构,最好学习JavaEE。 JEE一直觉得门槛太高。其实你可以从Spring开始搞清楚什么是反射、控制反转、依赖注入(这些名词其实是用来解决Java本身动态性不够的问题,这里就不多说了,我只是想提醒您,这些概念没什么大不了的,不要被自命不凡的家伙吓倒)。还有消息传递和 ORM 之类的东西,让我们把它们都弄清楚。想想他们试图解决的问题,然后猜测他们是如何做到的。在面试的过程中我发现,其实大多数优秀的开发者,即使以前从来没有考虑过这个问题,也能当场设计出Hibernate,而且设计得几乎一样。由此可见,这些框架的东西并不是什么大不了的事情。有了基础,还可以设计。关键是要用脑子。上面是一个服务器端开发的例子。对于客户端来说,你要思考事件响应机制是如何工作的(这个我不太熟悉,就不多说了)。还可以深入研究JVM的源码,其实现机制,了解垃圾回收算法等。
此时,您可以申请高级Java开发职位。如果运气好的话,年薪30万是有可能的。最低保障也是20万。
8. 建筑。至此,你已经进入房间,真正成为一名高级开发人员了。在这一步中,你要考虑更多的事情,比如如何处理高并发,如何处理分布式系统,如何提供更健壮的数据服务。目前还没有什么现成的可以参考的。这一切都取决于你自己的理解。所以它最终能达到什么高度,这不是我以我的水平可以评论的。
编程的世界永远向每一个热爱编程的人开放。这是一个自由、平等、共享的世界。我一直相信这一点。
附:国外程序员整理的Java资源全集
建造
这是用于构建应用程序的工具的集合。
Apache Maven:Maven 使用声明进行构建和依赖关系管理,更喜欢使用约定而不是配置进行构建。 Maven 比 Apache Ant 更好。后者使用过程化的方式进行配置,因此维护起来相当困难。
Gradle:Gradle 使用增量构建。 Gradle 是通过 Groovy 编程而不是传统的 XML 声明来配置的。 Gradle 与 Maven 配合良好,可进行依赖管理,并将 Ant 脚本视为一等公民。
字节码操作
用于编程 Java 字节码的函数库。
ASM:通用低级字节码操作和分析。
Javassist:尝试简化字节码编辑。
Byte Buddy:使用“Streaming API”进一步简化字节码生成。
代码分析
软件测量和质量评估工具。
Checkstyle:编程规范和标准的静态分析。
FindBugs:通过字节码静态分析查找潜在的错误。
PMD:源码中不良编程习惯分析。
SonarQube:通过插件集成其他分析组件,提供评估最终结果报告。
编译器
用于创建解析器、解释器和编译器的框架。
ANTLR:用于复杂分析的全功能自顶向下框架。
JavaCC:比 ANTLR 更具体,并且更容易上手。支持句法前瞻。
持续集成
支持持续集成、测试和应用程序发布的工具。
Bamboo:Atlassian 的持续集成 (CI) 解决方案,包括许多其他产品。
CircleCI:提供免费试用的托管服务。
Codeship:提供有限免费计划的托管服务。
Go:ThoughtWork 开源持续集成解决方案。
Jenkins:提供基于服务器的部署服务。
TeamCity:JetBrain 持续集成解决方案,提供免费版本。
Travis:提供托管服务,常用于开源项目。
数据库
简化数据库交互的工具和库。
Flyway:使用Java API轻松完成数据库迁移。
H2:一个小型 SQL 数据库,以其内存操作而闻名。
JDBI:方便的 JDBC 抽象。
jOOQ:基于 SQL 模式生成类型安全的代码。
Presto:用于大数据的分布式 SQL 查询引擎。
Querydsl:Java 的类型安全统一查询。
日期和时间
用于处理日期和时间的函数库。
Joda-Time:在Java 8出现之前,它是一个用于日期和时间处理的标准函数库。
Time4J:Java高级日期和时间函数库。
依赖注入
帮助代码实现控制反转模式的库。
Dagger:一个编译时注入框架,不使用反射,主要用于Android开发。
Guice:一个轻量级的注入框架,功能堪比Dagger的强大。
开发库
从根本上改进开发流程。
AspectJ:面向切面的编程扩展,与程序无缝连接。
Auto:源代码生成器的集合。
DCEVM:通过修改 JVM,加载的类可以在运行时无限次地重新定义。 OpenJDK 7 和 8 已提供支持,请查看此分支(fork)了解详细信息。
JRebel:商业软件,可以立即重新加载代码和配置,无需重新部署。
Lombok:旨在减少 Java 中冗余代码的代码生成器。
RxJava:一个用于使用 JVM 中的可观察序列创建异步、基于事件的应用程序的库。
Spring Loaded:另一个 JVM 类重新加载代理。
vert.x:JVM多语言事件驱动应用程序框架。
分布式应用
用于开发分布式容错应用程序的库和框架。
Akka:用于构建并发、分布式和容错的事件驱动应用程序的工具包和运行时。
Apache Storm:分布式实时计算系统。
Apache ZooKeeper:使用分布式配置、同步和命名注册为大型分布式系统提供协调服务。
Hazelcast:分布式、高度可扩展的内存网格。
Hystrix:为分布式系统提供延迟和容错。
JGroups:一组提供可靠消息传递并可用于创建集群的工具包。集群中的节点可以互相发送消息。
Quasar:为 JVM 提供轻量级线程和 actor。
发布
使用本机格式分发 Java 应用程序的工具。
Bintray:二进制版本的版本控制,与 Maven 或 Gradle 配合使用。
IzPack:构建跨平台部署的授权工具。
Launch4j:将 JAR 包装到小型 Windows 可执行文件中。
packr:将程序 JAR、资源和 JVM 打包到 Windows、Linux 和 Mac OS X 的本机文件中。
文件处理
用于处理Office格式文档的函数库。
Apache POI:支持 OOXML(XLSX、DOCX、PPTX)和 OLE2(XLS、DOC 或 PPT)格式的文档。
jOpenDocument:处理OpenDocument格式的文档。
游戏开发
游戏开发框架。
jMonkeyEngine:支持现代3D开发的游戏引擎。
libGDX:一个全面的跨平台高级开发框架。
LWJGL:一个健壮的框架,抽象了OpenGL、CL、AL和其他函数库。
图形用户界面
用于创建现代图形用户界面的库。
JavaFX:Swing 的继承者。
Scene Builder:JavaFX 虚拟布局工具。
高性能
与高性能计算相关的资源,包括许多特定功能的集合和函数库。
Disruptor:线程间消息传递函数库。
fastutil:快速且紧凑的 Java 类型安全集合。
GS Collections:受 Smalltalk 启发的集合框架。
hftc:哈希集和哈希图。
HPPC:基本类型的集合。
Javolution:实时嵌入式系统的函数库。
Trove:基本类型的集合。
集成开发环境
简化开发的集成开发环境。
Eclipse:它在后台做了很多工作,并以其丰富的插件而闻名。
IntelliJ IDEA:支持多种JVM语言,为Android开发提供了很多不错的选择。其商业版本主要针对企业用户。
NetBeans:集成了许多 Java SE 和 Java EE 功能,包括数据库访问、服务器、HTML5 和 AngularJS。
图像处理
帮助创建、评估或操作图形的函数库。
Picasso:Android图像下载和图像缓存函数库。
ZXing:多种格式的一维、二维条码处理函数库。
JSON
用于简化 JSON 处理的函数库。
Gson:将 Java 对象序列化为 JSON,反之亦然。使用时可提供出色的性能。
Jackson:和GSON类似,但是如果Jackson库需要频繁初始化的话会导致性能问题。
JVM 和 JDK
当前 JVM 和 JDK 实现。
JDK 9:JDK 9 早期访问版本。
OpenJDK:开源实现。
日志
用于记录应用程序的记录函数库。
Apache Log4j 2:对先前版本的完全重写。当前版本具有强大的插件和配置架构。
kibana:分析和可视化日志。
Logback:Log4j原团队的作品。事实证明,它是一个强大的日志记录库,通过 Groovy 提供了许多有趣的配置选项。
Logstash:日志文件管理工具。
SLF4J:日志抽象层,需要与特定的日志框架配合使用。
机器学习
提供特定统计算法的工具。它的算法从数据中学习。
Apache Hadoop:一种开源软件框架,用于在商用硬件集群上进行大规模数据存储和处理。
Apache Mahout:一种专注于协作过滤、聚类和分类的可扩展算法。
Apache Spark:一个开源数据分析集群计算框架。
h2o:用于大数据统计的分析引擎。
Weka:数据挖掘算法的集合,包括从预处理到可视化的各个级别。
信息
用于客户端之间消息传递的工具,确保协议独立性。
Apache ActiveMQ:一个实现JMS的开源消息代理,可以将同步通信转换为异步通信。
Apache Kafka:高吞吐量分布式消息系统。
JBoss HornetQ:清晰、准确、模块化且易于嵌入的消息传递工具。
JeroMQ:ZeroMQ 的纯 Java 实现。
其他
其他资源。
设计模式:最常见的设计模式的实现和解释。
Jimfs:内存文件系统。
Lanterna:一个类似于curses的简单控制台文本GUI函数库。
LightAdmin:可插入的 CRUD UI 函数库,用于快速应用程序开发。
指标:创建您自己的软件指标或将指标信息添加到支持框架,通过 JMX 或 HTTP 发布或发送到数据库。
OpenRefine:用于处理杂乱数据的工具,包括清理、转换、使用 Web 服务扩展数据以及将其链接到数据库。
RoboVM:用 Java 编写本机 iOS 应用程序。
自然语言处理
专门用于处理文本的函数库。
Apache OpenNL:用于执行分词等常见任务的工具。
CoreNLP:斯坦福大学的 CoreNLP 提供了一组基本工具,可以处理标记、实体名称识别和情感分析等任务。
LingPipe:一组可以处理各种任务的工具,支持POS标签、情感分析等。
Mallet:统计自然语言处理、文档分类、聚类、主题建模等。
网络
网络编程函数库。
Netty:用于构建高性能 Web 应用程序开发的框架。