2016年终总结:从校园到职场的技术反思
前言
2016年即将结束,回顾这半年多的时间,从9月份入职到现在,我已经在Android开发的岗位上工作了三个多月。从校园走向职场,从理论学习到实践应用,这段时间的成长和变化让我感慨良多。借此年终总结的机会,梳理一下自己的技术成长历程和心得体会。
技术成长回顾
1. 开发环境的适应
校园环境:
- Eclipse + ADT Plugin
- 手动管理依赖
- 简单的调试方式
- 个人独立开发
职场环境:
- Android Studio 2.2
- Gradle依赖管理
- 完整的调试工具链
- 团队协作开发
适应过程: 刚开始使用Android Studio时,很多快捷键和操作方式都与Eclipse不同,特别是Gradle的配置让我困惑了很久。但经过mentor张哥的指导和自己的摸索,现在已经能够熟练使用Android Studio的各种功能。
2. 架构模式的学习
入职前的认知: 在学校里,我们写的Android项目都是直接在Activity中写逻辑,代码结构比较简单。
现在的理解: 通过这几个月的学习,我深刻理解了MVP架构的重要性:
// 之前的做法(不推荐)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 直接在Activity中写网络请求
OkHttpClient client = new OkHttpClient();
// ... 大量业务逻辑
}
}
// 现在的做法(MVP架构)
public class MainPresenter implements MainContract.Presenter {
private MainContract.View view;
private MainModel model;
@Override
public void loadData() {
model.fetchData(new Callback() {
@Override
public void onSuccess(Data data) {
view.showData(data);
}
});
}
}
学习心得:
- 解耦的重要性:MVP让代码更容易维护和测试
- 职责分离:View负责显示,Model负责数据,Presenter负责逻辑
- 可测试性:Presenter可以独立测试,不依赖Android环境
3. 网络框架的使用
技术栈演进:
- 从
HttpURLConnection到Retrofit 2.0 - 从手动解析JSON到
Gson自动解析 - 从同步请求到
RxJava异步处理
Retrofit使用示例:
public interface ApiService {
@GET("users/{id}")
Call<User> getUser(@Path("id") int userId);
@POST("users")
@FormUrlEncoded
Call<User> createUser(
@Field("name") String name,
@Field("email") String email
);
}
// 使用方式
Call<User> call = apiService.getUser(123);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
// 处理成功响应
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// 处理网络错误
}
});
学习体会:
- Retrofit的注解方式让网络请求变得非常简洁
- OkHttp的拦截器机制很强大,可以做日志、缓存等处理
- 错误处理比想象中复杂,需要考虑网络超时、服务器错误等各种情况
4. 内存管理的认识
第一次OOM事件的教训: 在11月份,我负责的注册功能出现了严重的内存泄漏问题,导致线上用户大量崩溃。这次事件让我深刻认识到了内存管理的重要性。
学到的知识:
- Handler内存泄漏:匿名内部类持有外部类引用
- Context泄漏:不当的Context使用会导致Activity无法回收
- Bitmap处理:大图片需要及时回收,使用适当的压缩策略
- 工具使用:LeakCanary、MAT等内存分析工具的使用方法
代码改进:
// 问题代码
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 持有Activity引用,导致内存泄漏
}
};
// 改进后的代码
private static class SafeHandler extends Handler {
private WeakReference<MyActivity> mActivity;
public SafeHandler(MyActivity activity) {
mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
MyActivity activity = mActivity.get();
if (activity != null) {
// 安全的引用
}
}
}
工作方法的转变
1. 从"能跑就行"到"质量第一"
学生时代:
- 只要功能实现,能运行就好
- 代码规范不太重视
- 测试主要靠手动
职场要求:
- 代码质量直接影响用户体验
- 需要考虑性能、稳定性、可维护性
- 自动化测试和代码审查
2. 学习方式的改变
学校学习:
- 理论学习为主
- 按照教材和课程进度
- 考试导向
职场学习:
- 实践驱动学习
- 问题导向,遇到问题才深入学习
- 需要主动学习新技术
学习方法总结:
- 实践为主:先用起来,再深入理解
- 问题驱动:遇到问题时的解决方案记得最牢
- 向同事学习:mentor的指导比看书更有效
- 官方文档:遇到问题先看官方文档
3. 团队协作的体会
代码审查:
- 以前写代码都是自己看,现在每行代码都要经过review
- 别人能发现很多自己忽略的问题
- 通过review也能学习到别人的优秀实践
版本控制:
- 从简单的git add/commit/push到完整的分支管理
- 学会了feature branch、merge request等工作流程
- 理解了提交信息的重要性
技术栈掌握情况
已掌握的技术
| 技术 | 掌握程度 | 使用场景 |
|---|---|---|
| Java基础 | 熟练 | 日常开发 |
| Android基础 | 熟练 | UI、生命周期、四大组件 |
| MVP架构 | 熟练 | 项目架构设计 |
| Retrofit | 熟练 | 网络请求 |
| OkHttp | 熟悉 | 网络底层、拦截器 |
| Gson | 熟练 | JSON解析 |
| Gradle | 熟悉 | 依赖管理、构建配置 |
| Git | 熟练 | 版本控制 |
需要加强的技术
| 技术 | 当前水平 | 2017年目标 |
|---|---|---|
| RxJava | 了解 | 熟练使用 |
| 单元测试 | 不熟悉 | 掌握JUnit、Mockito |
| 性能优化 | 了解 | 深入理解 |
| 自定义View | 不熟悉 | 能够独立开发 |
2017年技术规划
1. 短期目标(1-3个月)
- 深入理解RxJava:掌握响应式编程思想
- 学习单元测试:JUnit、Mockito等测试框架
- 性能优化实践:启动速度、内存优化等
2. 中期目标(3-6个月)
- Kotlin学习:Google在IO大会上推荐的语言
- 架构升级:学习MVVM、Clean Architecture等
- 组件化开发:了解模块化架构设计
3. 长期目标(6-12个月)
- 深入理解Android底层:Framework、性能调优
- 技术分享:在团队内做技术分享
- 开源贡献:参与开源项目,提升技术影响力
心态变化
1. 从"什么都不会"到"每天都在进步"
刚入职时,面对复杂的项目代码和各种新技术,经常感到焦虑和不安。现在逐渐适应了这种学习节奏,明白了技术成长是一个持续的过程。
2. 从"单打独斗"到"团队协作"
在学校都是独立完成项目,现在明白了团队协作的重要性。代码审查、技术讨论、知识分享都让我的成长速度加快了。
3. 从"完成任务"到"追求卓越"
不再满足于仅仅完成需求,开始思考如何写更好的代码,如何优化性能,如何提升用户体验。
反思与不足
1. 学习深度不够
很多时候只是学会了如何使用某个技术,但对其原理理解不够深入。比如Retrofit的动态代理机制、OkHttp的连接池管理等。
2. 主动性有待提高
很多时候还是被动地等待任务,缺乏主动发现问题和解决问题的意识。
3. 技术广度不足
目前主要专注于Android开发,对后端技术、DevOps等了解较少,技术视野需要拓宽。
感谢与展望
感谢
- mentor张哥:耐心的指导和帮助
- 团队同事:良好的技术氛围和知识分享
- 公司平台:提供了学习和成长的机会
展望
2017年,我希望能够在以下几个方面有所突破:
- 技术深度:深入理解Android底层机制
- 技术广度:了解前后端协作,成为更全面的开发者
- 影响力:不仅自己成长,也能帮助团队其他成员成长
结语
2016年是我职业生涯的起点,虽然还有很多不足,但相比9月份刚入职时已经有了很大的进步。技术这条路很长,需要持续学习和积累。感谢这一年遇到的所有人和事,期待2017年能够继续成长,成为一个更优秀的Android开发者。
2016年技术栈总结:
Android SDK 23 (6.0)
Java 8
MVP Architecture
Retrofit 2.0 + OkHttp 3.0 + Gson
LeakCanary 1.5
RxJava 1.0 (初步了解)
Butter Knife 8.0
2017年学习计划:
- RxJava深入学习
- Kotlin语言学习
- 性能优化实践
- 单元测试掌握
- 架构设计理解