messages.content: 如何开发软件
messages.role: user
messages.content: 软件开发工程师是一份报酬优厚的工作，他们所具备的技能很有市场。那么他们到底是做什么的呢？如果你的薪水远远低于他们，不妨加入他们的行列。你可能会心存疑虑：自己是否具备开发优秀产品所必需的技术知识和受众关联性呢？无须担忧，按照如下步骤逐步执行后，加上一点点的灵感创意，就能成为一名软件开发工程师。
  
  ## 掌握诀窍
  
  **1. 确定你对哪一种软件类型感兴趣。**软件开发有两大基本阵营，分别是“应用开发”和“系统开发”。应用开发关注的是开发满足用户需求的程序，包括手机应用程序、大型电子游戏及企业级会计软件等。而系统开发关注的则是使用生命周期法来开发和维护操作系统。系统开发通常涉及网络可操作性和数据安全。
  
  **2. 自学编程语言。**任何人都有创意灵感，但开发者能够将创意转化为现实。即便你只想从事软件设计方面的工作，也必须对代码有一定了解，以便能够开发出产品的基本原型。你能够自学的编程语言种类繁多，其中较为实用和重要的有：
  
  C - C语言历史较为悠久，但仍被广泛使用，本列表中的其他语言多以C语言为基础。C语言被用来开发低级别程序，其运行与计算机硬件紧密相关。
  C++ - 它是C语言面向对象的版本，是全世界最流行的编程语言。Chrome浏览器、火狐浏览器、Photoshop软件，以及诸多其他程序使用的编程语言都是C++。此外，C++也常被用于开发电子游戏。市场对C++开发工程师的需求量一直很大。
  Java - Java语言是对C++语言的发展和继承，因易于移植而受到欢迎。几乎任何系统都能运行Java虚拟机，从而能够运行Java软件。Java语言被广泛应用于电子游戏和商业软件，许多人建议将它作为基本语言。
  C# - C#是一种基于Windows系统的语言，它是微软.NET框架的组成部分。这种语言与Java及C++关系紧密，掌握Java的开发者能够快速地过渡到C#。它对于Windows软件或Windows手机软件的开发者而言尤其实用。
  Objective-C - Objective-C也以C语言为基础，专为苹果系统而设计。被广泛用于iPhone和iPad应用。对于自由开发者而言，学习这种语言是一种不错的选择。
  Python - Python是最容易学习的语言之一，适用于网络开发。
  
  PHP - 准确来说，PHP并非软件开发语言，但如果你有志于从事网络开发，它必不可少。PHP开发工程师的就业机会一直很多，但薪水要低于软件开发工程师。
  
  **3. 找到有助于学习的资源。**大部分书店都有编程书籍专区，而亚马逊和其他电子商务零售商也提供了海量选择。质量上乘的编程书籍很可能是你能够拥有的最好资源。从事开发项目时，你可以快捷地查询和参考它们。
  除书籍以外，互联网也为学习者提供无穷宝藏。在CodeAcademy、可汗学院、 W3Schools、CSDN、开源中国和程序员之家等网站上，都能够搜索到关于你所选择的编程语言学习资料。
  
  **4. 上培训课。**尽管从事软件开发工作不需要有全日制学位，但是在本地培训中心听一下相关课程仍会对你有所帮助。一对一的教学对你大有裨益，而且这些课程会向你提出挑战，要求你解决一些自学时可能不会想到的问题。
  
  培训机构会收学费，因此确保你报名的课程有助于你实现自己的学习目标。
  尽管许多开发者能够完全依靠一技之长来进入这个行业，但拥有四年制大学的计算机科学学士学位，无疑能够帮助你更快地脱颖而出。大学教育将使你具备更广阔的背景知识，还另外提供数学、逻辑学等其他实用课程。
  
  **5. 做个人喜欢的项目。**将你新习得的编程技能应用到实际工作前，可以先做一些自己的小项目。试着挑战自我，应用编程语言去解决问题。这样不仅可以帮你巩固技能，还能够使你的简历内容更加丰富。
  
  例如，试着设计自己的日程表程序来帮助你安排工作，取代计算机自带的日程表程序。
  如果你对电子游戏开发感兴趣，可以试着做一些简单的小游戏，不必注重图形或复杂的机制。你的目标应该是使它们有趣而独特。一系列独立开发的小游戏会让你的工作经验增色不少。
  
  **6. 提问。**互联网是与其他开发者进行联系的绝佳方式。如果你在自己的项目上遇到瓶颈，可以上SegmentFault等网站寻求帮助。清楚地阐述你的问题，和已经尝试过几种可能的解决方案。
  
  **7. 每天练习。**每天做做自己的小项目，哪怕只花一个小时。这样做有助于保持状态和不断学习新技术。许多开发者学习语言的成功基础就是每天接触和使用这种语言。
  每天设定一个专门用于编程的时间，或设定一个完成的时间期限。尽量保证工作日能够每天抽出时间来做你的项目，这样到了周末就可以好好放松了。
  
  ## 开发程序
  
  **1. 寻找灵感创意**。好的程序会为用户的生活带来便利。看看你现在工作中使用的软件，是否有方法能够让流程更加简单或顺畅。成功的程序必须让用户觉得实用。
  
  检查你在计算机上的日常工作。能否使用某个程序来使一部分的工作实现自动化？
  记下每个创意。即使某个创意现在看来有些愚蠢或古怪，在未来它可能变得实用，甚至大获成功。
  检查其他程序。这些程序是做什么的？如何让它们做得更好？它们缺少什么？回答这些问题有助于你获取自己的创意。
  
  **2. 编写设计文档。**文档概述程序的特征，以及项目计划达成的目标。在开发过程中参考设计文档，可以防止你的项目偏离正轨，专注于正确的方向。关于编写设计文档的详细信息，可以参阅这篇文章。
  
  **3. 创建原型。**原型是一种基础程序，它展示你希望实现的功能。原型是一种快速程序，在你找到合适的设计之前，应当不断迭代更新。例如，你正在开发一个日程表程序，你的原型就应该是一个日期正确，并可以添加事件的基础日程表。
  
  在开发周期中，随着你想到解决问题的新方法，或有了更多想要实现的新创意，你的原型会不断改变。
  原型无须美观。事实上，在原型中，艺术设计的优先级是最低的。还是拿日程表来举例，你的原型很可能只有文本。
  
  **4. 反复测试。**Bug是所有开发者的烦恼之源。代码错误和预期外使用可能导致程序出现各种问题。在项目开发过程中，尽可能多地对程序进行测试。做各种尝试去破坏程序，然后根据结果去优化程序，避免它在未来因为相同的原因而崩溃。让亲朋好友测试你的程序，并反馈他们的测试结果。任何可以获得反馈的方法都能够为开发工作提供帮助。
  
  如果你的程序涉及日期，试着输入奇怪的日期。过去或未来久远的日期可能导致程序出现奇怪的反应。
  输入错误类别的变量。例如，你有一份表单询问用户的年龄，可以试着输入汉字词语，看看程序会有何反应。
  如果程序拥有图形界面，试着点击所有元素。点击返回上一屏，或以错误的顺序点击按钮会发生什么？
  
  **5. 完善项目。**在原型和开发阶段，粗略的作品就足够了，但是，如果你希望其他人使用你的程序，就得花费一些时间来完善它。这意味着让菜单流程符合逻辑，用户界面（UI）简洁易用，没有明显bug，而且程序整体美观。
  
  UI设计和功能可能非常困难和复杂。UI设计已经成为一份工作。你所能做的是确保自己的程序易于使用，看上去不会让人觉得刺眼。而专业的UI则可能必须付出一定的预算，请专业的团队来完成。
  如果你拥有预算，可以找到很多有能力设计UI的自由图形设计师为你工作。如果项目颇具规模，希望做出现象级的优秀产品，就必须找到优秀的UI设计师，请他们加入你的团队。
  
  **6. 将你的项目上传到GitHub。**GitHub是一个允许你与其他人分享代码的开源社区。这样做不仅能够让你更加深入地了解自己的代码，还会使寻找相关解决方案的其他开发者受益。GitHub既是极佳的学习资源，又是建立自己作品集的好方法。
  
  **7. 发布你的软件。**产品完成开发后，你可以选择是否将之发布。如今，软件有多种发布渠道，具体取决于你所开发的软件类型。
  
  小型团队或独立开发者常常通过个人网站发布软件。确保网站充分展示了程序的所有特性，并包含一些截图和使用教程。如果你要售卖自己的软件，确保你拥有一个运行良好的数字支付系统，以及一台可以分发软件的服务器。
  如果你为特定的设备或操作系统开发软件，可以使用各种应用商店来发布。例如，如果你为安卓设备开发软件，可以通过Google Play商店、亚马逊应用商店或个人网站来售卖它。
  
  ## 获取工作
  
  **1. 接临时工作。**尽管这类工作的薪水和可靠性都低于全职工作，但完成一些临时工作可以极大地丰富你的工作经历。试着上猪八戒和一品威客等网站找工作。刚开始想找到工作可能比较困难，但拿到并完成第一份工作后就简单多了。
  
  对于临时工作和自由开发者工作而言，猪八戒是不错的平台。点击主页的“IT/软件”，查看平台上的开发工作。
  出低价来获取临时工作看上去或许很有诱惑力，但不要廉价出卖自己的服务。这样做不仅会使你多劳少得，还会得罪同行，不利于建立人际关系。
  有时候，在临时工作中表现优异可以带来全职工作机会。在工作中始终全力以赴！
  
  **2. 尽可能地多社交**。尽可能多地去参加行业大会和编程马拉松。这不仅会让你接触更多代码，解决更多问题，还有助于结交业内同行。你可能会想象程序员们在自己的基地里孤军奋战，但实际上，大部分全职的开发工程师会团队协作。在这一行中，建立人际关系同样十分重要。
  
  **3. 应聘全职岗位。**完成几项临时工作后，就可以开始向更大型的机构发送你的简历和作品集，应聘全职岗位了。除了智联招聘以外，你还应该关注专门的程序员招聘平台，例如CSDN JOB、博客园招聘、开源中国招聘等。
  
  **4. 丰富你的技能组。**优秀的软件开发工程师通常精通多种语言。除了在工作中学以致用外，你还可以利用业余时间来自我提升，学习一两种其他语言的基础知识。这样，在过渡到新的项目时，你会感到更加轻松，就业竞争力也会更强。
  
  **5. 不要担心薪水。**不是所有入门级的软件开发工作都有六位数的薪水。事实上，这种工作根本不存在。但是，软件开发工作的优点是就业市场需求旺盛。作为一名软件开发工程师，如果你对自己现有的薪资感到不满，只要你具备相关技能，就可以很容易地跳槽到一家新的公司。你应该利用最初的几份工作来积累必要的经验，而不是关注它提供了多少养老金。
messages.role: assistant