V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kaoneiliusi
V2EX  ›  Python

如果能解决这种等级的问题,在码农里大概是个啥水平?

  •  
  •   kaoneiliusi · 2018-09-22 22:06:31 +08:00 · 7151 次点击
    这是一个创建于 2014 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天在招聘网上和豆瓣的一个运维开发类岗位负责人接触,出了一道笔试题。 我看了下原程序是 C 写的,但是自己看了看自认为虽然给我俩礼拜我学习一下应该能完成,但是短期内应该完成不了(半吊子运维出身代码能力不行) 于是给谢绝了。 不过还是很好奇,大概什么程度的码农能一天左右完成这题呢?

    基于 ncdu 实现一个命令行工具,用来定位文件系统中占用了较大空间的文件、目录。 需求场景描述 在运维工作中,经常会遇到磁盘空间被写满的情况,大部分情况是根分区。这种情况需要尽快处理以免影响系统上其它服务。这时候就需要去定位是哪些文件、目录占用了较大空间,以此判断是哪个服务异常,进而解决问题。在文件系统中找出大文件是一件非常耗时的事情,当 inodes 数很大时尤甚。

    好在 ncdu 高效地完成了扫描文件系统各文件、目录占用的工作,但是要达到我们的目标——直接将大文件展示出来,还需要做一些额外工作。

    要求说明 实现一个在 Linux 环境下运行的命令行工具,命令行参数符合规范。注意,是基于 ncdu 实现一个新的命令行工具。 以人为本,便捷易用,能够最大程度减轻 SA 的在这件事情上的时间消耗。

    除命令帮助信息 -h, --help 外,对使用场景及对应的相关命令做简单文字性描述。

    会从命令接口设计、代码实现、开发风格、使用场景设计、执行性能等角度去评价这个命令行工具。

    推荐优先使用 Python 实现,但原则上实现语言不作为评价依据。

    完成的项目需要放到 GitHub 上面,建议保留完整的 commit 历史,需要写清楚如何运行。

    最终提交的是 GitHub Repo 页链接。

    36 条回复    2018-09-29 11:07:15 +08:00
    lance6716
        1
    lance6716  
       2018-09-22 22:13:35 +08:00 via Android   ❤️ 1
    并没有看到明确的要求,连要点都交代的工作并不想干
    widewing
        2
    widewing  
       2018-09-22 22:16:51 +08:00 via Android
    为什么要基于 ncdu,ncurses 的程序怎么“基于”。。直接遍历文件不是更方便吗
    widewing
        3
    widewing  
       2018-09-22 22:18:56 +08:00 via Android
    @lance6716 就是说选择目录,列出目录中的大文件吧。并且能够选择进入子目录继续查这种吧。
    newborn
        4
    newborn  
       2018-09-22 22:23:52 +08:00
    我感觉我能用 bash 写一个出来。那个要求不是说可以用 python 吗?这不基本上就是脚本语言调 ncdu 执行文件对输出结果进行重新编排或者执行过程简化和控制。
    xuanbg
        5
    xuanbg  
       2018-09-22 22:24:21 +08:00
    1、可以设置忽略路径,因为有些路径没必要去扫
    2、剩下的从根开始递归遍历,得到所有文件的大小,以及文件夹下所有文件所占用的空间。
    3、可以对第二个功能得到的结果排序
    4、可以单个删除文件或直接删除文件夹
    5、可以设置监控路径,实时刷新数据

    另外,为什么要做命令行工具,明明是图形化界面更方便
    xuanbg
        6
    xuanbg  
       2018-09-22 22:30:09 +08:00   ❤️ 2
    除了本身就是搞这种工具的,一般人一天是搞不定的。这个和编程水平无关,编程首先得要知道干什么,然后需要知道怎么干,最后才是写代码。写代码也许一天就够,但不是天天和这类工具打交道的,前面两步搞定差不多也要三天往上了。所以一般人 1 周搞出来属于水平很高了。

    划重点:能独立搞出来的才叫程序员,让别人告诉你怎么做才能搞出来的叫码农。
    imdong
        7
    imdong  
       2018-09-23 00:27:07 +08:00
    直接系统原生命令写个 shell 不就能实现了?

    du -sh /*
    AX5N
        8
    AX5N  
       2018-09-23 00:55:38 +08:00
    感觉我没看懂难在哪,不就是遍历所有文件拿到每个文件的大小吗,那之后干啥不都是随便?
    0044200420
        9
    0044200420  
       2018-09-23 01:14:08 +08:00
    一次性列出,不要求后续交互,那很容易吧
    首先,看可以不可以导出结果文件,不用跟 ncdu 交互
    开始面向 google 编程,ncdu export 第一条,哦,自带 json 输出,那后面的就简单啦
    https://dev.yorhel.nl/ncdu/jsonfmt
    粗略设计,按扩展名、路径、大小进行过滤显示,差不多了吧
    ncdu 应该支持过滤参数吧,不行就清洗 json 咯
    让我一天来做这个,可以慢慢划水交货
    lolizeppelin
        10
    lolizeppelin  
       2018-09-23 01:19:58 +08:00 via Android
    考察点之一 参数处理 注意 这是运维开发 给运维写工具的 命令行参数处理不好怎么开发


    考差点 2 高效扫描文件 说实话这我都不知道咋弄 得看相关 c 工具的代码 估计最佳做法是用 c 写 Python 的计算太慢了
    lolizeppelin
        11
    lolizeppelin  
       2018-09-23 01:24:56 +08:00 via Android   ❤️ 1
    我看过 python 代码里
    命令行参数处理做的最佳的就是 openstack 的配置文件模块了 屌得一 b

    把这直接抄了 配置文件和命令行部分直接满分 232
    lolizeppelin
        12
    lolizeppelin  
       2018-09-23 01:26:25 +08:00 via Android
    哦 扫文件已经基于 ncud 了 那就简单得一 b 了
    直接掉库就是
    lolizeppelin
        13
    lolizeppelin  
       2018-09-23 01:52:09 +08:00 via Android
    命令行这玩意 好好写一天不一定够

    但是 一个好的运维 早就面对我这个问题了
    各种工具 salt stack ansb 什么的都有可参考的对象
    也就是说肯定老早就有一套现成可用的了

    现在还没现成的说明你积累不够 水平没到

    挺好的一道题目
    enjoyCoding
        14
    enjoyCoding  
       2018-09-23 02:09:19 +08:00 via Android
    设计加编程实现加文档 一天?? 这公司不缺人吧…
    tab
        15
    tab  
       2018-09-23 02:33:01 +08:00
    背景知识:Linux/Unix 环境编程(了解 file descriptor,会自己实现个 ls, cp 命令啥的),Python,C,如果你都比较熟悉而且看你描述好像给了 C 语言的源程序,就是主要逻辑翻译一下查查 ncdu 实现再加一些细节逻辑一天肯定不是问题。如果不是很熟悉需要自己了解的话,尤其是操作系统命令行这些东西,可能需要额外学习了解,时间视个人能力和基础水平不定。话说回来,运维岗位的话,如果 Linux 和 Python 不熟悉,那你自己是存在短板的,这些不熟悉应该很难写出运维自动化的脚本,估计平时用的运维工具具体实现和原理大概也不够了解。实际上这种题考查的知识点运维应该比很多程序员要有一点优势,尤其是现在大前端各个平台各种面向应用层的码农,他们平时很难接触到这些。
    WordTian
        16
    WordTian  
       2018-09-23 03:11:16 +08:00 via Android
    感觉能写,但是我肯定一天搞不定,估计得一周
    先是熟悉 ncdu 的详细用法,再加上命令行选项设计,估计就得一两天,开发得一两天,优化估计再一两天...
    emm...看来我还太菜了
    aijam
        17
    aijam  
       2018-09-23 03:53:13 +08:00
    @0044200420 基本同思路。一小时出 prototype,半天基本能搞定。
    ryd994
        18
    ryd994  
       2018-09-23 06:03:49 +08:00 via Android
    一直都是 du -a --max-depth=1 | sort -n
    反正有缓存,实际上就是第一次跑时间长,后面都很快
    SSD 的话就更不用说了
    SuperMild
        19
    SuperMild  
       2018-09-23 06:43:40 +08:00 via iPhone
    划重点,扫描的具体实现是直接用 ncdu !要做的只是处理参数输入和结果展示而已。
    taowen
        20
    taowen  
       2018-09-23 08:16:24 +08:00
    重点是 以人为本,便捷易用

    这是考察产品分析和设计能力吧
    lsls931011
        21
    lsls931011  
       2018-09-23 08:59:21 +08:00   ❤️ 1
    然后拿到答案,你可以回家等消息了
    okjb
        22
    okjb  
       2018-09-23 09:04:22 +08:00
    @lsls931011 真的皮
    crayygy
        23
    crayygy  
       2018-09-23 09:56:55 +08:00 via iPhone
    这个问题描述看着还真的有点像骗代码的。
    详细的文档和 help,详细的 commit 和使用说明,建议使用指定语言(便于以后维护)。
    希望是我想多了吧
    swulling
        24
    swulling  
       2018-09-23 10:03:24 +08:00 via iPhone
    刚毕业的学生给一周时间应该能写出来符合要求的

    工作一两年的可以在两天内完成

    再往后就和能力无关了,这个题的能力要求本来就比较低
    sampeng
        25
    sampeng  
       2018-09-23 10:09:14 +08:00 via iPhone
    刚搜了一下 ncdu。这写个程序满足需求很难?
    newtype0092
        26
    newtype0092  
       2018-09-23 10:38:23 +08:00
    @crayygy 看着乱七八糟的要求很多,可实际具体使用方式并没有限定,就只给了个“直接将大文件展示出来”的要求,要是骗代码肯定会指定输入输出吧,不然自己设计的接口他们拿到完整的东西可能也很难用。
    当然不排除招聘方连设计接口的能力都没有或者懒得做,看谁的方案好用谁的。。。
    lihongjie0209
        27
    lihongjie0209  
       2018-09-23 10:46:19 +08:00
    在文件系统中找出大文件是一件非常耗时的事情,当 inodes 数很大时尤甚。

    好在 ncdu 高效地完成了扫描文件系统各文件、目录占用的工作,但是要达到我们的目标——直接将大文件展示出来,还需要做一些额外工作。



    题目中要求的关键是展示!!!

    文件系统遍历是 ncdu 帮你做的, 文件系统的扫描结果也是 ncdu 帮你定好了, 按照一个传统的三层架构来说,

    presentation layer (你的任务)
    service layer(ncdu)
    dao layer(ncdu 导出的 json)

    你的任务就是写一个展示层把 ncdu 的导出的 json 文件展示一下好了.




    题目的关键: 但是要达到我们的目标——直接将大文件展示出来

    这里我们可以做一些合理的推论, 要展示的不只是大文件, 还有大文件夹, 毕竟这个也是一个合理的需求.

    那么你的程序在设计的时候主要的功能应该是大文件 /文件夹排序, 比如说展示 top10 的大文件 /大文件夹


    其他可以想到需要优化的地方:

    1. 缓存, 每次扫描整个文件系统其实还是很耗时的, 如果说你的文件系统在一定时间范围内是稳定的, 那么可以加一个缓存, 这样别人在基于你的命令开发的时候会感谢你, 不然调试一个 grep, awk 都需要几秒钟那就太痛苦了.
    2. 导出你的结果, 类似于 ncdu 一样的提供一个 json 导出
    3. 执行性能, 这个东西需要看使用场景才能优化, 没有 profile 就别优化, 但是你需要在你的程序运行时写出足够的日志来帮你做 profile.




    ----------------------至于说什么水平--------
    我是 Java 开发, 无法评价运维水平. 这道题目中涉及到的 ncdu 是我第一次接触, 花了 15 分钟看文档和下载下来跑 demo, 还得感谢题主让我了解到一个好工具.
    newtype0092
        28
    newtype0092  
       2018-09-23 10:50:35 +08:00
    @xuanbg 题目要求的是基于 ncdu,这个东西本身就是能在终端里使用的图形化工具,而且功能复杂。
    现在要求“直接将大文件展示出来”,相当于从瑞士军刀上拆个小刀头过来,再自己装个手柄。
    干什么(显示大文件)和怎么干(封装 ncdu )已经比较明确了,算是码农都搞得定的要求了吧。
    liangdu
        29
    liangdu  
       2018-09-23 10:55:26 +08:00 via Android
    这问题没难度,思路也很好讲。用来作为面试考察点,看出出题者意图不善。加之,他问了一个似乎很无聊的问题"一天能不能搞定?",这个没做过就不能,有做过就可以可以。只能说明面试官真的不缺人才,缺流水劳动力
    xxgirl2
        30
    xxgirl2  
       2018-09-23 11:24:31 +08:00
    自带的 getopt 就能处理一些复杂的东西了,不过要打印用法的话 getopt 可能会显得繁琐,或许应该找找别的轮子
    wuweidong0107
        31
    wuweidong0107  
       2018-09-23 17:48:08 +08:00
    ncdu 是什么,找大文件为什么要基于 ncdu 找?它有什么优势吗?能不能用 find 命令找?
    superhan
        32
    superhan  
       2018-09-23 19:25:14 +08:00 via Android
    一半人阅读理解不过关,还有一些根本不知道 ncdu 说明没有运维经验。这题挺有用的
    ifaii
        33
    ifaii  
       2018-09-24 12:49:17 +08:00
    @superhan #32 混了多年运维 真不知道 ncdu 是啥,这种需求 du 配合 sort 一下都有了
    CheneyC
        34
    CheneyC  
       2018-09-24 14:28:16 +08:00
    监控服务器空间使用情况-crontab+python 邮件提醒
    https://my.oschina.net/ailou/blog/1547982
    xavierskip
        35
    xavierskip  
       2018-09-25 16:43:36 +08:00 via Android
    想起来之前看过相关的博文 https://blog.lilydjwg.me/2017/8/11/ncdu-diff.210359.html “谁又用掉了我的磁盘空间?——魔改 ncdu 来对比文件树大小变化”
    foxyier
        36
    foxyier  
       2018-09-29 11:07:15 +08:00
    被骗过代码的路过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   971 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:24 · PVG 04:24 · LAX 13:24 · JFK 16:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.