惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
V
V2EX
小众软件
小众软件
博客园 - 聂微东
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
F
Fortinet All Blogs
S
Schneier on Security
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
A
Arctic Wolf
量子位
博客园 - 叶小钗
I
Intezer
C
Check Point Blog
Cloudbric
Cloudbric
IT之家
IT之家
Last Week in AI
Last Week in AI
GbyAI
GbyAI
Attack and Defense Labs
Attack and Defense Labs
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
J
Java Code Geeks
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
T
Threatpost

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
如何学习一门新的编程语言 - 以 Python 为例
微信公众号 · 2017-10-14 · via 陈少文的网站

1. 了解新语言产生的背景

ABC 是专门为非专业程序员设计的一种教学语言,但是由于其封闭,并未取得成功。1989年的圣诞节期间,吉多·范罗苏姆开发了一个新的脚本解释器,并命名为 Python,作为 ABC 语言的一种继承。新的脚本解释器开放,完美结合了 Unix Shell 和 C 的使用习惯。

2. 了解新语言应用的场景

  • 网站后台

    有大量成熟的框架,如 Django,Flask,Tornado

  • 网络爬虫

    Python 写爬虫有很多库可用,如 Scrapy,Beautiful Soup

  • 科学计算

    可以替代 R 语言和 Matlab,如 NumPy, SciPy, Matplotlib, Pandas

  • 数据挖掘,机器学习,大数据

    Scikit-learn,Libsvm,TensorFlow

  • 系统部署,运维脚本

    Shell 适合简单的系统管理工作,但涉及复杂的自动化任务还是需要 Python。

3. 了解新语言的特点

Python 的设计哲学是:优雅、明确、简单。Python 的开发哲学是:用一种方法,最好是只有一种方法来做一件事,有些类似 Unix。与其他语言非常不一样的是,Python 以缩进来确定语句块。

Python 是一门面向对象的动态、解释型语言,具有出色的模块化特性。同时,Python 拥有大量的第三方开源包,可以直接使用,极大地提高了开发效率。Python 编写的代码,可读性强,特别适合多人大型项目的开发。但是 Python 的执行效率比不上 C/C++ 这类编译型语言。

4. 学习新语言的数据结构

Python 中内置类型有整型 int,浮点型 float,布尔型 bool,字符串 str,列表 list,元组 tuple,字典 dict,集合 set。与 C 不同的是,Python 并不依赖于关键字定义各种类型。Python 是动态强类型语言,是通过运行时,自动选择合适的数据类型。字符串、列表、元组、集合、字典等复杂数据类型,并不是 C 语言的内置类型。

5. 学习新语言的逻辑结构

if 条件判断结构

1
2
3
4
5
6
7
condition = 1
if condition == 1:
    print 1
elif condition == 2:
    print 2
else:
    print 3

for 循环结构

1
2
3
items = ['item1', 'item2', 'item3']
for item in items:
    print item

while 循环结构

1
2
3
4
5
sum, n = 0, 10
while n > 0:
    sum = sum + n
    n = n - 2
print sum

Keywords: if; for; while;

6. 学习定义一个独立模块

定义函数:

1
2
def function_name(x):
    return -x

定义类:

1
2
3
4
5
6
7
class ClassName:            #经典类、旧类
    def __init__(self):
        pass

class NewClassName(object):    #新类
    def __init__(self):
        pass

在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。

定义包:
Python 中定义一个包,只需要在文件夹里面,创建一个 __init__.py文件即可,如:

1
2
3
mypackage/__init__.py
mypackage/test.py
mypackage/views.py

那么在其他文件中,就可以通过 from mypackage import views 的语法,从 mypackage 这个包里面导入 views 。

7. 做一个小的项目

尝试完成一次领域实践,是对这个领域最佳的入门方式。学习一门新的编程语言,成长最快的阶段在,利用这门编程语言完成项目需求期间。

Django 是一个十分优秀的 Python 写的 Web 程序框架,广泛用于数据驱动类的网站开发。Django 是一个大而全的开发框架,基本不需要额外的第三方配置,就可以快速地进行开发。

笔者的小项目需求是:利用二维码扫码,查看在线简历。

确定项目需求之后,会迎来一个手足无措的时期,不知道从哪里着手开始做项目。如果有一个过来人指导一下,那么很快就能开始编码了。不幸的是,笔者当时身边并没有这样一个人。在网上查阅资料后,最终选定了Jquery 、Foundation、Django 实现这个项目。

实际上,笔者在此之前一直在写 C++ 程序,并没有 Python 的编程基础,仅仅是因为这个小项目,选定的技术栈后台使用的是 Django ,才开始学习 Python。

除了掌握项目使用到的技术栈,在完成项目的过程中,还可以解锁调试技能、通过搜索引擎解决各种程序问题的能力。

为了完成这个小项目,需要走出舒适区,突破原有的技术栈,最终获得快速的技术成长。

8. 学习使用库完成任务

通常,发布者会将使用频率高、可以复用的功能,打包成库,提供给大家共同使用。

库可以分为两类:

  • 一种是官方的库,通常质量比较高、会维护更新;
  • 一种是第三方的库,质量参差不齐,需要自己甄别。

例如,Django 中提供了 from django.views.decorators.http import require_POST 装饰器用于确保 view 函数的请求方法是 POST。使用这个装饰器可以简化 view 函数中的条件判断,有利于编写简洁易读的代码。当然 ,Django 还有大量的第三方 App 可以下载使用,直接提供一个完整功能。

在项目开发的过程中,合理地使用库会起到锦上添花的效果。

9. 学习组织代码结构

研究怎样更好的组织项目的代码是一门管理科学。笔者之前也写过相关的博文
Django浅析与工程目录结构实践 讨论了 Django 工程的目录组织结构。

好的项目代码结构需要学习一些高关注度的开源项目的经验,也需要注意输出,成为大家共同的标准,共同维护,产生影响力。

10. 学习让代码易维护

代码维护分为两类:

  • Bug 易修复,需要代码具有良好的命名习惯、注释、日志输出,实现相同的功能编写尽量少的代码
  • 新功能的扩展,通常是在原有逻辑上,创建新的分支。这类分支又可以分为代码级别和常量级别。我们需要的是通过常量的配置扩展新功能,而减少代码级别的修改

11. 提高代码复用率

随着使用新语言年限的增长,参与项目的增多,会出现一个显而易见的问题:在不同的项目中,会有一些非常类似的功能。甚至在开发新项目时,有时还会去以前项目中拷贝代码。

这时,应该思考如何提高代码的复用率,如何提供公共组件。

代码的复用可以分为:

  • 代码片段(Snippets)

    维护一个 Snippets List 是个不错的注意

  • 公共组件(Components)

    公共组件需要从项目中分离,会有一定的工作量,但收益很大

从项目中分离公共组件的过程,需要关注模块内的高内聚,模块间的低耦合。在模块分离的过程中,我们会更加深入地去理解应用系统。这一过程的完成,又将极大地提高开发效率。

更重要的是,我们不仅仅从项目中分离出一个公共组件,在使用其他人提供的公共组件时,也会变得容易。

下一次项目开发时,需要一个新功能,你首先想到的可能不是编码,而是去公共组件库或 Github 搜索有没有类似的包,然后经过简单的改造就能在项目使用。

12. 关注性能

针对 Web 应用,高并发、高可用、高一致性始终是亘古不变的议题。在对应用系统不断发起挑战时,那些隐藏的曾经被忽略的问题才会逐渐显现。在这个过程中,不断地发现应用系统的瓶颈,解决这些瓶颈,循环往复,不断加深对业务、对应用系统的理解。

性能报告是性能测试输出的结果。性能报告就像质检报告一样,是让用户信任和使用产品的凭证。高并发、高可用、高一致,并不是口号,需要数据的举证,需要不断的优化性能。

13. 源码阅读

阅读源代码有利于提高自己的代码水平。阅读 Python 解释器的源码,有利于编写高性能的代码。阅读 Django 源码有利于编写易维护、易更新的 Django App。从开始学习这门新语言时,就可以开始尝试阅读源代码。

14. 参考