作为开发人员,无论我们的专业是什么,无论是数据科学、前端还是后端,我们都会花费超过 75% 的时间阅读他人编写的代码。该任务可能是一项艰巨的任务。
话虽如此,有效阅读他人代码的能力是可以使软件工程工作变得更加愉快的技能之一。不幸的是,这也是一项被学校、训练营和公司广泛忽视的技能。这是每个人都认为您知道或擅长的技能之一,只是因为您知道如何编写代码。
关于编写代码的事情是,每个人都有自己的编码风格。阅读代码不同于阅读小说或故事;这不仅仅是阅读屏幕上的说明。相反,当您阅读别人编写的代码时,您不仅仅是在阅读他们的代码。您正在尝试了解他们的思维过程以及他们在编写该代码时的想法。
不用说,这是一项极具挑战性的任务。但是,这项任务可以成倍地简化。在本文中,我将带您完成阅读和理解他人代码的 4 个步骤。
为了解释不同的步骤,我将通过我为网络抓取教程编写的代码。
#Import needed libraries
from bs4 import BeautifulSoup as bs
import requests as rq
import pygal
import time
import pygal
from IPython.display import display, HTML
base_html = """
"""
#define functions for data collection
def find_book_name(table):
if table.find('caption'):
name = table.find('caption')
return name.text
def get_author(table):
author_name = table.find(text='Author').next.text
return author_name
def get_genre(table):
if table.find(text='Genre'):
genre = table.find(text='Genre').next.text
else:
genre = table.find(text='Subject').next.next.next.text
return genre
def get_publishing_date(table):
if table.find(text='Publication date'):
date = table.find(text='Publication date').next.text
else:
date = table.find(text='Published').next.text
pattern = re.compile(r'd{4}')
year = re.findall(pattern, date)[0]
return int(year)
def get_pages_count(table):
pages = table.find(text='Pages').next.text
return int(pages)
def parse_wiki_page(url):
page = rq.get(url).text
return bs(page)
def get_book_info_robust(book_url):
#To avoid breaking the code
try:
book_soup = parse_wiki_page(book_url)
book_table = book_soup.find('table',class_="infobox vcard")
except:
print(f"Cannot parse table: {book_url}")
return None
book_info = {}
#get info with custom functions
values = ['Author', 'Book Name', 'Genre',
'Publication Year', 'Page Count']
functions = [get_author, find_book_name, get_genre,
get_publishing_date, get_pages_count]
for val, func in zip(values, functions):
try:
book_info[val] = func(book_table)
except:
book_info[val] = None
return book_info
#Get books
url = 'https://en.wikipedia.org/wiki/Time%27s_List_of_the_100_Best_Novels'
page = rq.get(url).text
soup = bs(page)
rows = soup.find('table', class_="wikitable sortable").find_all('tr')[1:]
books_links = [row.find('a')['href'] for row in rows]
base_url = 'https://en.wikipedia.org'
books_urls = [base_url + link for link in books_links]
#to store books info
book_info_list = []
#loop first books
for link in books_urls:
#get book info
book_info = get_book_info_robust(link)
#if everything is correct and no error occurs
if book_info:
book_info_list.append(book_info)
#puase a second between each book
time.sleep(1)
#Collect different genres
genres = {}
for book in book_info_list:
book_gen = book['Genre']
if book_gen:
if 'fiction' in book_gen or 'Fiction' in book_gen:
book_gen = 'fiction'
if book_gen not in genres: #count books in each genre
genres[book_gen] = 1
else:
genres[book_gen] += 1
print(genres)
#Plot results
bar_chart = pygal.Bar(height=400)
[bar_chart.add(k,v) for k,v in genres.items()]
display(HTML(base_html.format(rendered_chart=bar_chart.render(is_unicode=True))))
每当您获得需要阅读和理解的代码时,要做的第一件事——也是最明显的,我可能会争辩说——就是运行代码并查看它的作用。它需要什么作为输入?输出是什么?
那么,让我们继续运行上面的代码并探索结果。
并非所有代码都会生成图表;一些代码的输出将是文本输出。无论输出类型如何,我们都可以探索它来猜测(如果您还不知道)编写代码的大致目的。
但是,这可能不会为您提供有关代码细节的很多细节,或者如果此代码是更大项目的一部分,您可能不知道它是如何连接的,但您将学习如何构建和运行它. 此外,您还将了解它使用的库和它所依赖的框架。
尽管如此,运行代码将为您提供更好地理解它所需的信息,并确保您获得每个依赖项,您需要开始工作并扩展它。
现在我们知道了代码的作用和输出是什么,我们可以开始更深入地研究它的细节。为此,我们需要精确定位代码的开头。如果您使用的编程语言具有必须的main功能,如 C、C++ 或 Java,请从那里开始,逐步了解其他功能。
但是,如果您使用的是 Python,则并非所有代码都有函数main,但您可以使用缩进来了解代码的起始位置。比如上面的代码,我们有多个函数,那么代码的起点就在第80行。
因此,我们可以首先开始查看注释(如果有的话)并查看代码的整个主要部分,而无需深入了解子函数的细节。
遍历该main函数可为您提供代码的一般流程,每个子函数的作用,而不是它们的工作方式,而是它们的作用。
仔细阅读代码的主要部分后,您可能会发现在调试模式下运行代码很有用。这样做的原因是,当您在调试器中运行代码时,它允许您观察您的代码如何与内存交互。
它将向您展示每个变量如何随着代码中的每一步而变化。这样做将使您对代码的内部功能及其不同功能有更深入的了解。
一旦您看到代码中的每个变量如何随每一行变化,您就可以开始在代码中添加自己的注释,向自己解释每一行代码的作用。
我发现有很大帮助的一件事是在调试器模式下运行时构建代码连接的思维导图。调试器模式向您展示了不同代码项之间的清晰联系。
从思维导图中间的代码文件的名称开始,然后分支出不同的功能以及它们的连接方式。尝试将代码中的变量也鼓励到思维导图中,也许不是所有变量,而是对整体结果影响最大的变量。
此外,尝试包括代码的输入和输出以及它们的类型或预期类型。这是上面代码的思维导图。
每当您与此代码库交互时,构建思维导图将为您节省大量时间。如果您想添加或删除代码的任何部分,它将帮助您了解连接。
阅读其他开发人员编写的代码可能是一项极具挑战性的任务;你需要了解他们的逻辑,他们的风格,以及他们的具体选择。看了那么多不同层次、不同年龄的程序员写的代码。经历过这些之后,我提出了自己的 4 步流程来简化阅读、探索和理解基本上不是我的人编写的代码。
这 4 步过程很简单,将为您节省大量时间和精力;您需要做的就是:
我希望您发现这些步骤对您在下一次代码探索冒险中节省大量时间和精力很有用。
“事实上,阅读与写作所花费的时间之比远远超过 10 比 1。我们不断阅读旧代码,以此作为编写新代码的一部分。...... [因此] 使其易于阅读使得编写起来更容易。”
——罗伯特·C·马丁
页面更新:2024-06-09
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号