What is a Full Stack developer?

Facebook强调招聘全栈开发者,即对整个技术体系有深入理解的程序员。文章详细介绍了全栈开发者的职责,从服务器、网络和主机环境,到数据建模、业务逻辑、API层面、用户界面和用户体验等方面,全面涵盖了技术、业务需求和用户反馈的重要性。

译文:

期望一个凡人掌握开发过程中各个方面的知识,合理吗?也许不合理,但是Facebook正是要寻找这样的人。在一个OSCON会议上,一名Facebook的工程师告诉我的,他们只聘请“全能(Full stack)”的程序员。那么,全能是什么意思呢?

对于我,一个全能的程序员应该熟悉每一个层面的技术知识,如果不是全部掌握,也要对所有的软件技术有真正的兴趣。

熟悉整个技术体系的程序员,可以使得周围的人的生活更加容易。这就是为什么我反对在工作场合的技术鸿沟。当然,大公司里的政治和沟通的问题往往会影响他们的发展。我想Facebook招聘策略的目的就在于,如果聪明的人身心俱到,一个好的产品可以在更短的时间内发布。

技术知识体系的分层:

1.    服务器,网络和主机环境

  1. 这包括理解什么会宕机,为什么会,没有任何资源是理所当然的。
  2. 合理使用文件系统,云存储,网络资源,理解数据冗余和可用性。
  3. 在硬件受限的情况下,如何扩展应用。
  4. 那么关于多线程和竞争呢?你猜怎么着,你在你的开发机器上看不到,但是在现实中却经常发生。
  5. 全能程序员可以与DevOps协同工作。系统应该提供有效的错误信息和日志能力。DevOps会在你之前看到这些信息,使它们有意义。

2.    数据建模

  1. 如果数据模型存在缺陷,那么业务逻辑和更高的层次将要用奇怪、丑陋的代码来弥补那些模型没有覆盖到的边界场景。
  2. 全能程序员知道如何构建合理规范化的关系模型,包括外键、索引、视图、查找表等。
  3. 全能程序员熟悉非关系数据存储的概念,理解其比关系型数据存储的优点。

3.    业务逻辑

  1. 明白应用程序提供的核心商业价值。
  2. 需要扎实的面向对象知识。
  3. 需要理解框架。

4.    API层面/Action层面/MVC

  1. 理解外部如何与业务逻辑和数据模型进行交互。
  2. 框架在这里会用得很多。
  3. 全能的程序员有能力写出清晰,一致,简单易用的接口。一些API的复杂得使我感到厌烦。

5.    用户界面

  1. 全能程序员a)知道如何创建可读的布局,或者b)明白自己需要帮助艺术和图形设计师。无论哪一种,实现好的视觉设计是关键。
  2. 掌握HTML5/CSS3。
  3. Javascript在将来会是非常重要的一门语言,很多令人兴奋的作品都是用Javascript完成的。(node, backbone, knockout……)

6.    用户体验

  1. 全能程序员明白,用户只是想让产品可以正常工作。
  2. 一个好的系统不会使得用户患上腕管综合征和眼痛病。一个全能程序员会将一个需要8次点击3个步骤的工序,修改为1次点击。
  3. 全能程序员会添加有用的错误信息。如果有什么出错了,要向用户道歉。有时程序员漫不经心写的错误信息会让用户觉得很傻。

7.    理解用户和业务的需求

  1. 现在我们模糊的进行的架构设计,但这会远离了真正的需求。
  2. 全能程序员会预先看看当用户在使用软件的时候,会发生什么。同时,他们也会关注业务部分。

其他问题:

  1. 能够编写质量单元测试。顺便说说,Javascript现在也可以进行单元测试了。
  2. 理解持续自动化集成,包括构建应用,测试,编写文档和部署扩展。
  3. 安全意识也非常重要,因为每一个层面都会有其易受攻击的地方。

总结:

将代码紧紧的绑到一个特定的环境(库,操作系统,硬件等等),是非常糟糕的实践来的。全能程序员理解所有的知识体系,不意味着他们可以走捷径。然而,他们确实会这样做,如果只是建立一个原型的话。

技术型创业公司需要全能程序员的多才多艺。但是,一个成熟的公司,需要更多的是专注的技术。

我不确定在你使用多种语言,使用多个平台,甚至为多个行业工作之前,你是否可以自称为全能程序员。全能程序员要在“高级程序员”之上,因为他们与通晓多语言的程序员在同一线上,但是对各个模块的关系更有全局的意识。注意我刚刚的列表,只有3-5项包含了编写代码。

 

 原文:

Is it reasonable to expect mere morals to have mastery over every facet of the development stack? Probably not, but Facebook can ask for it. I was told at OSCON by a Facebook employee that they only hire ‘Full Stack’ developers.  Well, what does that mean?

To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.

Good developers who are familiar with the entire stack know how to make life easier for those around them. This is why I’m so against silos in the work place. Sure, politics and communication challenges get in the way in large organizations. I think the point Facebook is going for with their hiring policy is, if smart people use their heads and their hearts, a better product gets built in less time.

Layers of the Full Stack:

  1. Server, Network, and Hosting Environment.
    1. This involves understanding what can break and why, taking no resource for granted.
    2. Appropriate use of the file system, cloud storage, network resources, and an understanding of data redundancy and availability is necessary.
    3. How does the application scale given the hardware constraints?
    4. What about multi-threading and race conditions? Guess what, you won’t see those on your development machine, but they can and do happen in the real world.
    5. Full stack developers can work side by side with DevOps. The system should provide useful error messages and logging capabilities. DevOps will see the messages before you will, so make them count.
  2. Data Modeling
    1. If the data model is flawed, the business logic and higher layers start to need strange (ugly) code to compensate for corner cases the data model doesn’t cover.
    2. Full stack developers know how to create a reasonably normalized relational model, complete with foreign keys, indexes, views, lookup tables, etc.
    3. Full stack developers are familiar with the concept of non-relational data stores and understand where they shine over relational data stores.
  3. Business Logic
    1. The heart of the value the application provides.
    2. Solid object oriented skills are needed here.
    3. Frameworks might be needed here as well.
  4. API layer / Action Layer / MVC
    1. How the outside world operates against the business logic and data model.
    2. Frameworks at this level should be used heavily.
    3. Full stack developers have the ability to write clear, consistent, simple to use interfaces. The heights to which some APIs are convoluted repel me.
  5. User Interface
    1. Full stack developers: a) understand how to create a readable layout, or b) acknowledge they need help from artists and graphic designers. Either way, implementing a good visual design is key.
    2. Can include mastery of HTML5 / CSS.
    3. JavaScript is the up and coming language of the future and lots of exciting work is being done in the JavaScript world (node, backbone, knockout…)
  6. User Experience
    1. Full stack developers appreciate that users just want things to work.
    2. A good system doesn’t give its users carpal tunnel syndrome or sore eyes. A full stack developer can step back and look at a process that needs 8 clicks and 3 steps, and get it down to one click.
    3. Full stack developers write useful error messages. If something breaks, be apologetic about it. Sometimes programmers inadvertently write error messages that can make people feel stupid.
  7. Understanding what the customer and the business need.
    1. Now we are blurring into the line of architect, but that is too much of a hands off role.
    2. Full stack developers have a grasp of what is going on in field when the customer uses the software. They also have a grasp of the business.

 

Other Pieces of the Puzzle:

  1. Ability to write quality unit tests. By the way, even JavaScript can have unit tests these days.
  2. Understanding of repeatable automated processes for building the application, testing it, documenting it, and deploying it at scale.
  3. An awareness of security concerns is important, as each layer presents its own possible vulnerabilities.

 

Closing Thoughts:

It is very bad practice to tightly couple code to a specific implementation (library, OS, hardware, etc). Just because a full stack developer understands the entire spectrum doesn’t mean they have license to take shortcuts. Well, actually they do if it is a build and throw away prototype.

Technology start-ups need full stack developers for their versatility!  However, as an organization matures, it needs more and more focused skills.

I’m not sure you can call yourself a full stack developer until you have worked in multiple languages, platforms, and even industries in your professional career. Full stack goes beyond a ‘senior engineer’, as it is along the same lines as a polyglot programmer but with a higher view of all the connecting pieces. Note that on my list, only items 3-5 involve writing code.

<think>好的,我现在需要解决用户遇到的Gradle构建错误。首先,用户提供的错误信息是关于无法确定任务依赖关系,特别是`:app:compileDebugJavaWithJavac`。错误中提到`Cannot use @TaskAction annotation on method IncrementalTask.taskAction$gradle_core()`,并且指出`IncrementalTaskInputs`接口不是有效的参数。 首先,我应该回忆一下Gradle版本和Android Gradle插件(AGP)之间的兼容性问题。通常这类问题是因为Gradle版本与AGP版本不匹配导致的。例如,较新版本的AGP可能需要特定版本的Gradle支持,反之亦然。用户可能最近升级了其中一个而没有同步更新另一个。 接下来,我需要确定错误中的关键点。这里提到了`IncrementalTaskInputs`接口的问题。查阅文档或更新日志,可能发现这个接口在某个Gradle版本中被弃用或修改了。例如,在Gradle 7.0中,某些任务输入/输出的处理方式发生了变化,可能导致旧版插件不兼容。 用户可能正在使用较旧的AGP版本,而Gradle版本较新。例如,如果用户升级到Gradle 7.x,但AGP版本仍然是3.x或4.x,就会出现这样的兼容性问题。解决方法应该是检查并匹配两者的版本。 我需要引导用户检查他们的项目配置,特别是`build.gradle`文件中`dependencies`里`com.android.tools.build:gradle`的版本,以及`gradle-wrapper.properties`中的Gradle版本。然后,根据官方文档的兼容性表格,建议他们调整版本到匹配的组合。 另外,可能需要用户清理项目(如`./gradlew clean`),或者甚至删除`~/.gradle/caches`目录,以防旧版本缓存导致问题。此外,建议用户尝试使用Gradle的`--stacktrace`选项来获取更详细的错误信息,帮助进一步诊断。 还可能存在第三方插件与Gradle版本不兼容的情况,用户需要检查是否有过时的插件,并尝试更新或移除它们。例如,某些插件可能依赖于旧版的Gradle API,需要更新到支持新版本Gradle的插件版本。 最后,总结解决方案步骤:确认Gradle和AGP版本兼容,更新至推荐组合,清理项目,检查第三方插件,如有必要,逐步排查问题来源。</think>这个错误通常由Gradle版本与Android Gradle插件(AGP)版本不兼容引起。以下是逐步分析和解决方案: --- ### **错误原因分析** 1. **核心问题**:`IncrementalTaskInputs`接口在较新的Gradle版本中已被弃用,旧版Android插件尝试调用它时会产生兼容性问题。 2. **常见场景**: - 项目使用的**Android Gradle插件版本过低**(如AGP 3.x),而**Gradle版本过高**(如Gradle 7.x)。 - 第三方插件未适配新版Gradle API。 --- ### **解决方案** #### 步骤1:检查版本兼容性 1. 打开项目根目录的 `build.gradle`,查看AGP版本: ```groovy dependencies { classpath "com.android.tools.build:gradle:7.0.0" // 示例版本 } ``` 2. 检查 `gradle-wrapper.properties` 中的Gradle版本: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip ``` 3. **对照官方兼容性表**: | AGP版本 | 最低Gradle版本 | 最高Gradle版本 | |----------|---------------|---------------| | 7.0+ | 7.0 | 8.0 | | 4.2.0+ | 6.7.1 | 7.0 | | 3.5.0 | 5.6.4 | 6.9 | 📌 参考:[Android官方文档](https://developer.android.com/studio/releases/gradle-plugin#updating-gradle) #### 步骤2:调整版本 - **情况1**:如果AGP版本过低(如3.x),需升级到**AGP 7.0+**,并同步升级Gradle到**7.x**。 - **情况2**:如果Gradle版本过高(如8.x),需降级到**Gradle 7.x**,并确保AGP版本兼容。 #### 步骤3:清理缓存 1. 删除项目本地缓存: ```bash ./gradlew clean rm -rf ~/.gradle/caches ``` 2. 重新同步Gradle: - Android Studio ➔ File ➔ Sync Project with Gradle Files. #### 步骤4:检查第三方插件 若问题依旧,可能是第三方插件(如Firebase、Kotlin插件)不兼容新版Gradle。尝试: 1. 更新所有插件到最新版本。 2. 暂时注释掉插件,逐步排查问题来源。 --- ### **示例配置(AGP 7.x + Gradle 7.x)** 1. `build.gradle` (Project): ```groovy dependencies { classpath "com.android.tools.build:gradle:7.4.2" } ``` 2. `gradle-wrapper.properties`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip ``` --- ### **附加调试命令** 通过以下命令获取详细日志: ```bash ./gradlew assembleDebug --stacktrace ./gradlew assembleDebug --info ``` --- ### **总结** - 核心矛盾:**Gradle与AGP版本不匹配**。 - 解决路径:**对齐版本 ➔ 清理缓存 ➔ 检查第三方依赖**。 - 仍无法解决?提供完整的 `build.gradle` 和 `gradle-wrapper.properties` 以进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值