DEV Community

Lidang 立党
Lidang 立党

Posted on

从产品的角度思考:小白们第一门编程语言需要什么样的package management?

我认为python的成功,很大程度上来源于Python对package的管理。
在terminal安装:

pip install YOUR_PACKAGE
Enter fullscreen mode Exit fullscreen mode

在源文件中使用:

import YOUR_PACKAGE as YP
x = YP.myFunction(value)
Enter fullscreen mode Exit fullscreen mode

几乎能让入门Python技术栈的人1分钟了解安装和使用的全部细节 — — 这也是Python作为世界最广泛的胶水语言和事实上许多细分领域行业的公认DSL的重要原因之一:只要库正确打包发布,所有小白都有机会在自己的电脑上用pip或者conda自动完成全部配置,并且通过1分钟的阅读来实现入门基本使用方法。
另一个让我印象深刻的是Deno。在不知道Ryan Dahl的设计时,我几乎构想出了和他相似的一种直接针对当代互联网的设计,即import from URL。比如Deno中是这样设计:

import yourFunction from "http://website.com/myscript.ts"
Enter fullscreen mode Exit fullscreen mode

这种设计让TypeScript非常灵活地组织了起来:对于熟悉TypeScript的人来说,不需要提前写繁琐的各种npm install,而是“新建文件”、“从URL直接import”、“写好运行” — — 对用户来说,无疑节约了若干个繁琐无用的步骤,当用户对网络I/O和recursive preprocessing的速度可以足够容忍时,这种设计对于轻量级的script的开发是方便的。

另一个我欣赏的设计,是R语言的install package。只要你的库发布到CRAN上,就可以在R里运行前直接安装:

install.packages("ggplot2")
Enter fullscreen mode Exit fullscreen mode

这无疑也是一种非常舒适的设计,也是R作为计算学家们爱不释手的原因之一:不需要退出环境后在terminal里进行繁琐的安装配置,直接可以在环境中一行自动搜索匹配下载安装CRAN中的包 — — 作为使用者来说,无疑是非常方便的。

那么有没有可能设计出一种更简单、更激进的package management方式,在不考虑性能和复杂度的前提下,让小白尽可能简单方便直观地使用别人的库同时发布自己的库?我个人有如下想法:

  1. 支持import from URL/package server。让小白绕过手动使用package manager,而直接让intepreter直接下载并加载到runtime中,这比额外在terminal或者GUI中额外手动配置安装package要更简单、更直观 — — 譬如只需要一行 *import MyLibrary: functionA, variableB, classC 或者 *import http://website.com/library.hhs ——剩下的就交给runtime自动下载MyLibrary、自动配置下载各个部分;

  2. 提供一个更加灵活的服务器,让A发布的packge能像google docs或者在线记事本一样编辑保存在服务器里,这样一旦保存,其他人就可以@your_username/your_package的形式来引用,譬如 *import @your_username/your_package ——这样普通用户让发布package更加简单,而不用经历略繁琐的npm/pip/conda的打包发布的步骤(对于初学者而言),而是简单得像写evernote笔记一样,编写+自动存储即可;

  3. 对于一次就用的module,可以提供更激进的语法糖直接使用,而省略多余的import,譬如在(1)中可以写成:

*import linearAlgebra:magic
matA = magic(5)
Enter fullscreen mode Exit fullscreen mode

而一个更省略的语法糖可以设计成为这样:

matA = <linearAlgebra:magic>(5)
Enter fullscreen mode Exit fullscreen mode

或者在(1)中可以写成:

*import @username/functionA
matA = functionA(5)
Enter fullscreen mode Exit fullscreen mode

而一个更省略的语法糖可以设计成为这样:

matA = <@username/functionA>(5)
Enter fullscreen mode Exit fullscreen mode

当用户想要使用linearAlgebra:magic或者@username/functionA一次且仅一次的时候,用户不需要安装配置等任何额外代码以外的工作,也不需要额外import一次,直接用语法糖< your_package >标记成远程package — — 只要中间的URL、package或者“用户名/function”的配置是正确的,用户直接一次使用,剩余的交给intepreter和server就可以了。

这是从product management的角度,以零基础编程小白的角度的一些思考和计划(在Hedgehog Lab未来的feature中)。

Top comments (0)