ARTS是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。

  1. Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。
  2. Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。
  3. Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。
  4. Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。

Algorithm(算法)

Leetcode 将有序数组转换为二叉搜索树

leetcode 108: https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public TreeNode sortedArrayToBST(int[] nums) {
  12. if (nums.length == 0) return null;
  13. TreeNode head = helper(nums, 0, nums.length - 1);
  14. return head;
  15. }
  16. public TreeNode helper(int[] nums, int low, int high) {
  17. // Done,边界条件
  18. if (low > high) return null;
  19. // 取中间值作为根节点
  20. int mid = (low + high) / 2;
  21. TreeNode node = new TreeNode(nums[mid]);
  22. // 使用递归方法构建左右子树
  23. node.left = helper(nums, low, mid - 1);
  24. node.right = helper(nums, mid + 1, high);
  25. return node;
  26. }
  27. }

Review(点评)

原文地址: 伟大的开发者永远不会停止学习

❶ - 阅读的艺术

图书

博客

推特

❷ - 从Avid Reader到Avid Writer

教是两次学习 - 约瑟夫·朱伯特

❸ - 听听!

播客是我的主要生活之一:它们专为多任务处理而设计(在烹饪晚餐,熨烫,跑腿等时)

❹ - 参加在线课程

为了开始学习新技术,我观看了视频:它们提供了理论与实践之间的完美平衡,并且作为视觉学习者,我发现它们非常有效。我以更高的播放速度观看它们,以最大化我通过的材料量。

网络上有无尽的在线课程,但这些是我经常使用的资源/平台:PluralSightCoursera可汗学院edX

❺ - 实践完美

概念证明(POC)

宠物项目

事实上,它们是没有压力的真实项目:没有最后期限,没有技术限制,没有对要求的控制(由于预算原因而大多削减),没有模式的捷径。我们是老板 - 我们制定规则!

开源

为开源项目做贡献是提高公众形象和实践的绝佳方式:我们只需找到我们感兴趣的项目,下载源代码,检查代码库,确保我们可以端到端运行,调试和我们准备陷入困境。

在线社区

通过在Stack Overflow等网站上提问和回答问题,成为在线社区的活跃成员也是一个绝佳的机会,不仅可以学习,还可以帮助其他人学习。促进代码和知识共享提供了很大的成就感。

Katas

Katas是简单的编码练习,即它们可以在几分钟内被理解,但是复杂到不能太快解决 - 这个术语是由Dave Thomas创作的,他是The Pragmatic Programmer一书的合着者,拥抱日本的Kata概念在武术。我尝试过这种技术作为一个实验,但很快就失去了兴趣。我更喜欢看真实的问题和大局,而不是单个类似拼图的练习。对于有经验的程序员,我认为本文中提到的其他方法更强大。
然而,Katas的资源是kata.softwarecraftsmanship.org

比赛

黑客马拉松是类似冲刺的马拉松,允许开发人员和IT专业人员在软件项目上进行协作,并创建工作原型,应用程序功能或集成(API)。这些好处在Quora中很好地列出,所以我不再在这里说了!我从来没有参加过一个,但它在我的尝试列表中!

❻ - 结对编程

为什么结对编程也增强了我们的学习,有几个令人信服的理由,但我发现的最大优势是我们被迫构建我们的思想,让我们在尝试向他人解释之前彻底理解我们自己的想法。最后,代码审查是通过直接反馈我们的代码来提高我们知识的最佳方式。它们不是暴露我们自己的局限,而是验证我们的想法或让它们受到挑战。

❼ - 社交

参加行业活动

LinkedIn

LinkedIn群组是寻找志同道合的专业人士以及在软件开发领域获得最新信息的绝佳方式。

加入专业组织

专业组织(如英国计算机协会)定期举办培训课程,提供全面的行业新闻,调查,职业信息,工作和活动细节(通常以折扣价格)。

这里的问题是我们得到的东西:为了充分获得作为成员提供给我们的内在利益,我们需要投入时间积极参与。

加入本地用户组

加入本地用户组和技术社区是与其他开发人员进行交互的简便方法。背景,领域和经验的多样性使这些变得特别。但有一个共同点:每个人都对编程充满热情!因此,每个人都乐于学习和分享他们所知道的东西!

建立自己的网络

您想进一步采取网络吗?以下是一些实用的想法:

  • 在您的组织内启动技术社区
  • 创建本地用户组
  • 在会议上发表演讲或成为主题发言人
  • 举行棕色包会议或圆桌会议,进行小组技术讨论

熟练起来跟上!

我们经常无法理解我们的职业生涯不再是我们教育的最终产品,而是我们的教育!如果我们保持学习习惯,我们可能会延长我们的寿命并提高我们的就业能力。另一个常见的陷阱是利用时间作为不采用持续学习的借口。我们都有时间!事实上,我们都有完全相同的时间。不同之处在于我们如何选择消费它! 这是对我自己的友好提醒

Tip(技巧)

swagger-spring-boot-starter快速集成swagger

  1. 添加Maven依赖
  1. <dependency>
  2. <groupId>com.spring4all</groupId>
  3. <artifactId>swagger-spring-boot-starter</artifactId>
  4. <version>1.9.0.RELEASE</version>
  5. </dependency>
  1. 启动类添加 @EnableSwagger2Doc 注解
  2. 配置

yml

  1. # swagger配置
  2. swagger:
  3. # 是否启用swagger,默认:true
  4. enabled: true
  5. # 标题
  6. title: "标题"
  7. contact:
  8. # 维护人
  9. name: "gaohanghang"
  10. email: "1341947277@qq.com"
  11. url: "http://ghang.top"
  12. # 版本
  13. version: "1.0"
  14. # 描述
  15. description: "API 描述"
  16. # swagger扫描的基础包,默认:全扫描
  17. base-package: "org"
  18. # 需要处理的基础URL规则,默认:/**
  19. base-path: /**
  20. # 需要排除的URL规则,默认:空
  21. # exclude-path: ""
  22. license: "Apache License, Version 2.0"
  23. license-url: "https://www.apache.org/licenses/LICENSE-2.0.html"

properties

  1. swagger.enabled=true
  2. swagger.title=URL Short Interface
  3. swagger.contact.name=gaohanghang
  4. swagger.contact.email=1341947277@qq.com
  5. swagger.contact.url=http://ghang.top
  6. swagger.version=1.0
  7. swagger.description=API
  8. swagger.base-package=com
  9. swagger.base-path=/**
  10. swagger.license=Apache License, Version 2.0
  11. swagger.license-url=https://www.apache.org/licenses/LICENSE-2.0.html
  1. 使用代码
  1. @Configuration
  2. public class WebMvcConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  5. registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  6. registry.addResourceHandler("swagger-ui.html")
  7. .addResourceLocations("classpath:/META-INF/resources/");
  8. registry.addResourceHandler("/webjars/**")
  9. .addResourceLocations("classpath:/META-INF/resources/webjars/");
  10. }
  11. }
  12. controller
  13. @Api(tags = {" 认证接口 "})
  14. @RestController
  15. @RequestMapping("/api/auth")
  16. public class AuthController {
  17. @Autowired
  18. private AuthService authService;
  19. @PostMapping("/signup")
  20. @ApiOperation(value = " 注册 ")
  21. public ResponseEntity signup(@RequestBody RegisterRequest registerRequest) {
  22. authService.signup(registerRequest);
  23. return new ResponseEntity(HttpStatus.OK);
  24. }
  25. @PostMapping("/login")
  26. @ApiOperation(value = " 登录 ")
  27. public AuthenticationResponse login(@RequestBody LoginRequest loginRequest) {
  28. return authService.login(loginRequest);
  29. }
  30. }
  31. model
  32. @ApiModel(value = "com.programming.techie.springngblog.dto.LoginRequest", description = "登录参数")
  33. public class LoginRequest {
  34. @ApiModelProperty(value = "用户名")
  35. private String username;
  36. @ApiModelProperty(value = "密码")
  37. private String password;
  38. public String getPassword() {
  39. return password;
  40. }
  41. public void setPassword(String password) {
  42. this.password = password;
  43. }
  44. public String getUsername() {
  45. return username;
  46. }
  47. public void setUsername(String username) {
  48. this.username = username;
  49. }
  50. }

Share(分享)

Packt是一家印刷点播出版公司,总部位于英国伯明翰和印度孟买。它的许多书籍都涉及信息技术或软件。它提供多种格式的印刷书籍和电子书。 除传统的出版活动外,Packt还支持和推广开源项目和概念。

image.png

https://subscription.packtpub.com/