CCNA AUTOMATION · 200-901 CCNAAUTO

ソフトウェア開発と設計 完全ガイド

Cisco公式の「CCNA Automation」認定ページおよび公式試験トピックPDF(200-901 CCNAAUTO v1.1)に基づき、試験ドメイン 「1.0 Software Development and Design」 を、初学者でも理解できるようステップバイステップで解説します。本ガイドはCisco社が発行する公式教材ではなく、非公式の学習補助資料です。

試験時間: 120分出題言語: 英語 / 日本語前提資格: なし本ドメインの出題比率: 15%
01 / 13

この認定と試験について

CCNA Automationは、ネットワークの自動化・プログラマビリティ領域における第一歩となる認定資格です。合格には、コア試験である 「Automating Networks Using Cisco Platforms(200-901 CCNAAUTO)v1.1」 を突破する必要があります。

項目内容
試験時間120分
出題言語英語・日本語
前提資格なし(1年以上のソフトウェア開発経験、特にPythonの実務経験があると学習がスムーズ)
有効期限3年間(継続教育クレジットまたは再受験で更新可能)

この試験は、単なる「ネットワークの知識」だけでなく、ソフトウェア開発の基礎知識Ciscoプラットフォームを操作する自動化スキルの両方を問う点が最大の特徴です。本ガイドで扱う「1.0 ソフトウェア開発と設計」は、その土台となる最初のドメインにあたります。

02 / 13

試験全体のドメイン構成

試験は6つのドメインで構成されており、それぞれに出題比率(重み)が設定されています。

ドメイン番号ドメイン名出題比率
1.0ソフトウェア開発と設計15%
2.0APIの理解と活用20%
3.0Ciscoプラットフォームと開発15%
4.0アプリケーション導入とセキュリティ15%
5.0インフラとオートメーション20%
6.0ネットワークの基礎15%

図: 6ドメインの出題比率

「1.0 ソフトウェア開発と設計」は全体の15%を占め、以下の8つの小項目(サブトピック)で構成されています。本ガイドではこの8項目すべてを順番に解説します。

図: ドメイン1.0を構成する8つのサブトピック

補足:Cisco公式の試験概要ページでは、この領域は「Python、Git、共通データ形式(XML・JSON・YAML)を含むソフトウェア開発スキルの実践」と紹介されています(出典は巻末参照)。

03 / 13 · 試験目標 1.1

データフォーマットの比較(XML / JSON / YAML)

なぜ学ぶのか

ネットワーク自動化では、機器の設定情報やAPIのレスポンスを「人間にも機械にも読み書きしやすい形式」でやり取りします。その代表格が XML・JSON・YAML の3つです。試験では、それぞれの特徴を理解し、状況に応じて使い分けられるかが問われます。

3つのフォーマットの比較表

観点XMLJSONYAML
読みやすさタグが多く冗長シンプルで読みやすいインデント主体で最も人間向き
構造の表現方法開始・終了タグで囲む波括弧・角括弧・コロンインデントとハイフンのみ
コメント標準では不可不可可能(#
データ型基本は文字列(スキーマで型定義も可)文字列・数値・真偽値・null・配列・オブジェクトJSONの上位互換(アンカーや複数行文字列なども可)
主な利用場面SOAP API、レガシーな設定ファイルREST APIのリクエスト/レスポンスAnsible Playbook、Kubernetes、CI/CD定義ファイル
拡張子.xml.json.yml / .yaml

同じ情報を3つの形式で書いてみる

同じネットワーク機器の情報を、それぞれの形式で表現すると次のようになります。

XML

<device>
<hostname>Router1</hostname>
<interface>
<name>GigabitEthernet0/1</name>
<status>up</status>
</interface>
</device>

JSON

{
"hostname": "Router1",
"interface": {
"name": "GigabitEthernet0/1",
"status": "up"
}
}

YAML

hostname: Router1
interface:
name: GigabitEthernet0/1
status: up

同じ内容でも、XMLはタグで、JSONは記号で、YAMLはインデントだけで階層構造を表現していることがわかります。

学習のポイント

  • REST API(ドメイン2.0で詳しく学習)のやり取りはJSONが主流
  • Ansibleの設定ファイルやCisco NSOのモデルはYAMLが主流
  • 古いSOAPベースのAPIや一部のネットワーク機器の設定エクスポートにはXMLが使われることがある
  • 試験では「どの形式が読みやすいか」「どの形式にコメントが書けるか」のような比較知識が問われやすい
04 / 13 · 試験目標 1.2

データフォーマットをPythonのデータ構造にパースする

「パース」とは何か

「パース(parse)」とは、テキストとして書かれたデータ(XML/JSON/YAML)を、プログラムが直接操作できるデータ構造(Pythonの dictlist など)に変換する処理のことです。

図: テキストからPythonデータ構造へのパースの流れ

JSONをパースする例

import json
raw_text = '{"hostname": "Router1", "status": "up"}'
# JSON文字列 → Pythonのdict型に変換
parsed = json.loads(raw_text)
print(parsed["hostname"]) # Router1
print(type(parsed)) # <class 'dict'>

YAMLをパースする例

import yaml
with open("device.yaml") as f:
config = yaml.safe_load(f)
print(config["hostname"]) # Router1
print(type(config)) # <class 'dict'>

XMLをパースする例

import xml.etree.ElementTree as ET
tree = ET.fromstring("<device><hostname>Router1</hostname></device>")
hostname = tree.find("hostname").text
print(hostname) # Router1

学習のポイント

  • JSONとYAMLは、パースすると多くの場合 Pythonの dict(辞書型)または list(リスト型) になる
  • XMLはやや特殊で、ツリー構造(要素オブジェクト)としてパースされることが多い
  • 試験では「このコードを実行した結果、変数の型は何になるか」といった読解問題が出やすいため、type() で型を確認する習慣をつけておくと良い
05 / 13 · 試験目標 1.3

テスト駆動開発(TDD)の概念

TDDとは

テスト駆動開発(Test-Driven Development)とは、「実装コードを書く前に、まずテストコードを書く」という開発スタイルです。一般的に次の3ステップを繰り返します。

図: Red → Green → Refactor のサイクル

コード例で見るTDDの流れ

# ① Red: 先にテストを書く(この時点ではadd関数は存在しないので失敗する)
def test_add():
assert add(2, 3) == 5
# ② Green: テストが通る最小限の実装を書く
def add(a, b):
return a + b
# ③ Refactor: 必要であれば、動作を変えずにコードを整理する
# (このシンプルな例ではこれ以上の改善は不要)

なぜTDDが重要なのか

メリット説明
仕様の明確化「何ができれば正しいか」を先に定義するため、実装の目的がぶれにくい
安心してリファクタリングできるテストがあることで、後からコードを変更しても壊れていないか即座に確認できる
自動化との相性ネットワーク自動化スクリプトも、意図しない設定変更を防ぐためにテストが重要
バグの早期発見実装直後にテストを実行するため、問題を早い段階で見つけられる

学習のポイント

  • 試験で問われるのは実装力そのものよりも「TDDという考え方・サイクルを説明できるか」という概念理解
  • Red → Green → Refactor の順番と、それぞれの段階で何をするかを覚えておく
06 / 13 · 試験目標 1.4

ソフトウェア開発手法の比較(Agile / Lean / Waterfall)

3つの開発手法の比較表

項目WaterfallAgileLean
進め方要件定義→設計→実装→テスト→リリースを一方向に進める短い反復(スプリント)を繰り返しながら少しずつ完成させる無駄を徹底的に排除し、価値の提供に集中する
変更への強さ弱い(後工程での仕様変更がしにくい)強い(都度フィードバックを反映できる)強い(継続的な改善を前提とする)
ドキュメント量事前に詳細な文書を作成する必要最小限、動くソフトウェアを重視必要な分だけ、ムダな文書は作らない
向いている場面要件が最初から固まっている大規模プロジェクト要件変化が多いプロダクト開発、スタートアップ製造業由来の考え方をITに応用したい場合
キーワードフェーズ、マイルストーンスプリント、イテレーション、ふりかえりカイゼン、ムダの排除、価値の流れ

フローで見る違い

図: Waterfall(直線的)とAgile(反復的)の進み方の違い

Waterfallは前の工程が終わってから次に進む「一方通行」のイメージ、Agileは短いサイクルを何度も回しながら少しずつ機能を追加していく「反復」のイメージです。

学習のポイント

  • 「後戻りしにくいのはどれか」「短いサイクルで開発するのはどれか」のような特徴のマッチングが出題されやすい
  • Leanは「開発プロセスそのもの」というより「ムダを減らす考え方」である点がAgileとの違い
07 / 13 · 試験目標 1.5

コードを関数・クラス・モジュールに整理する利点

なぜコードを整理するのか

自動化スクリプトが数行で済むうちは良いですが、規模が大きくなるとコードを整理する仕組みが必要になります。Pythonでは主に3段階の単位でコードを整理します。

図: モジュール・クラス・メソッドの階層関係

それぞれの単位と利点

単位説明主な利点
関数(Function)特定の処理をひとまとまりにしたもの同じ処理を何度も書かずに再利用できる/処理の意図が名前からわかる
クラス(Class)データ(属性)と処理(メソッド)をひとまとめにした設計図関連する状態と振る舞いをまとめて管理できる/複数のインスタンスを独立して扱える
モジュール(Module)関数やクラスをまとめた1つのファイル(または複数ファイルのパッケージ)機能ごとにファイルを分割できる/他のスクリプトから import して再利用できる

コード例

# config_utils.py というモジュールの中に、
# ConfigParserというクラスを定義する例
class ConfigParser:
def __init__(self, filepath):
self.filepath = filepath
def load_yaml(self):
import yaml
with open(self.filepath) as f:
return yaml.safe_load(f)
def get_hostname(self, config):
return config.get("hostname")
# 別のスクリプトから再利用する
from config_utils import ConfigParser
parser = ConfigParser("device.yaml")
config = parser.load_yaml()
print(parser.get_hostname(config))

学習のポイント

  • 「関数=処理のまとまり」「クラス=データと処理のまとまり」「モジュール=ファイル単位のまとまり」という粒度の違いを整理して覚える
  • 目的は一貫して再利用性・可読性・保守性の向上であることを押さえておく
08 / 13 · 試験目標 1.6

代表的なデザインパターン(MVCとObserver)

デザインパターンとは、ソフトウェア設計でよく出会う問題に対する「定石(型)」のことです。試験では MVCObserver の2つが対象です。

MVCパターン

MVCは「Model(データとロジック)」「View(画面表示)」「Controller(入力の処理)」の3つの役割にコードを分離する設計パターンです。

図: MVCパターンにおける3つの役割の関係

役割説明ネットワーク自動化での例
Modelデータそのものと、それを扱うロジック機器のステータス情報、設定データ
Viewユーザーに見える部分ダッシュボードの画面、CLIの出力
Controllerユーザーの入力を受けてModelを更新するWebhookを受け取り処理を振り分ける部分

利点:役割ごとにコードが分離されているため、画面デザインだけを変更したい場合でもロジックに手を入れずに済む、といった保守性・拡張性の高さが得られます。

Observerパターン

Observerパターンは、ある対象(Subject)の状態が変化したときに、それを購読している複数の相手(Observer)へ自動的に通知する設計パターンです。

図: Observerパターンの通知の流れ

利点:通知する側(Subject)は「誰が見ているか」を細かく意識せずに済み、新しいObserverを追加してもSubject側のコードを変更する必要がありません。ネットワーク自動化では、機器の状態変化をWebhookで複数のシステムに通知する仕組みなどがこの考え方に近いパターンです。

class Subject:
def __init__(self):
self._observers = []
def subscribe(self, observer):
self._observers.append(observer)
def notify(self, event):
for observer in self._observers:
observer.update(event)
class LogObserver:
def update(self, event):
print(f"ログに記録: {event}")
class AlertObserver:
def update(self, event):
print(f"アラート送信: {event}")
subject = Subject()
subject.subscribe(LogObserver())
subject.subscribe(AlertObserver())
subject.notify("インターフェースがダウンしました")

2つのパターンの比較

パターン目的主な構成要素典型的な利用例
MVC画面・ロジック・データを分離し保守性を高めるModel / View / ControllerWeb管理画面、監視ダッシュボード
Observer状態変化を複数の相手に自動で伝えるSubject(発行者)/ Observer(購読者)イベント通知、Webhook、GUIのイベント処理

学習のポイント

  • 「役割を分離するのはどちらか」=MVC、「変化を通知するのはどちらか」=Observer、という対応を覚える
  • 試験では実装の細部よりも「なぜこのパターンを使う利点があるのか」という設計意図の理解が問われる
09 / 13 · 試験目標 1.7

バージョン管理の利点

バージョン管理とは

バージョン管理システム(Version Control System, VCS)は、ファイルの変更履歴を記録し、いつ・誰が・何を変更したかを追跡できる仕組みです。Gitはその代表例です。

なぜ必要なのか

課題バージョン管理がない場合バージョン管理がある場合
変更履歴の把握config_final_v2_本当に最終.yaml のようなファイル名で管理しがちいつ・誰が・なぜ変更したかがコミット履歴として残る
複数人での共同作業上書き事故や作業の衝突が起きやすいブランチで作業を分離し、あとでマージできる
問題発生時の切り戻しどこまで戻せば良いか分からない特定のコミットまで簡単に戻せる
変更内容の説明「何を変えたか」を口頭やメモに頼るdiff で変更差分を正確に確認できる
監査・レビュー変更の妥当性を後から検証しにくいコミット単位でレビューでき、変更理由も記録に残る

ネットワーク自動化での重要性

ネットワーク機器の設定(YAML/JSONで表現された「インフラのコード」)をGitで管理することで、「いつ・誰が・どの設定をどう変えたか」を追跡できるようになります。これは、インフラをコードとして扱う考え方(Infrastructure as Code)の土台にもなる重要な概念です。

学習のポイント

  • 「変更履歴の追跡」「共同作業の容易化」「切り戻しの容易さ」「変更内容の可視化」の4点が代表的な利点
  • 試験では「バージョン管理がなぜ重要か」という理由を説明できるかが問われる
10 / 13 · 試験目標 1.8

Gitの基本操作

Gitにおける4つの領域

Gitの操作を理解するには、まず「データがどこにあるか」という4つの領域を押さえることが近道です。

図: 作業ディレクトリからリモートリポジトリまでの4つの領域

各コマンドの役割

コマンド目的動きのイメージ
git clone <url>リモートリポジトリを丸ごと自分のPCに複製するリモート → ローカル(新規取得)
git add <file>変更をステージングエリアに追加する作業ディレクトリ → ステージング
git rm <file>ファイルを追跡対象から削除する作業ディレクトリ/ステージング
git commit -m "..."ステージング内容をローカルの履歴として記録するステージング → ローカルリポジトリ
git pushローカルの変更をリモートへ反映するローカル → リモート
git pullリモートの変更を取得し、ローカルに反映するリモート → ローカル
git branch <name>新しい作業の分岐(ブランチ)を作成するローカルリポジトリ内
git merge <branch>別ブランチの変更を現在のブランチに取り込むローカルリポジトリ内
git diff変更差分を確認する任意の2つの状態間の比較

ブランチとマージのイメージ

新しい機能はいきなり本流(main)に手を入れず、専用のブランチを作って作業するのが一般的です。

図: ブランチの分岐とマージのイメージ

コンフリクト(衝突)が起きたら

同じ箇所を別々のブランチで変更していると、マージ時に「コンフリクト」が発生します。Gitは競合箇所を次のような目印つきでファイルに書き込むので、どちらを残すか(または両方を活かすか)を手動で判断して解消します。

<<<<<<< HEAD
(現在のブランチでの変更内容)
=======
(マージしようとしているブランチでの変更内容)
>>>>>>> feature-branch

解消手順の流れは次の通りです。

図: マージコンフリクト解消の流れ

diffで差分を確認する

git diff
- hostname: Router1
+ hostname: Router1-Core

- が削除された行、+ が追加された行を示し、変更内容を一目で確認できます。

学習のポイント

  • 各コマンドが「Gitの4つの領域のうち、どこからどこへデータを動かすものか」を対応づけて覚える
  • merge でコンフリクトが起きた場合の対処の流れ(手動編集 → addcommit)は特に問われやすい
  • diff は「変更前後の差分を可視化するもの」という位置づけを理解しておく
11 / 13

実践シナリオでつなげて理解する

ここまで学んだ8つの項目は、実際の自動化業務では次のように連携して使われます。

図: ソフトウェア開発と設計 8項目の実践フロー

このように、「1.0 ソフトウェア開発と設計」の8項目は独立した知識ではなく、現場の自動化スクリプト1本を作るまでの一連の流れを分解したものだと捉えると理解しやすくなります。

12 / 13

学習チェックリスト・理解度クイズ

チェックリスト

  • XML・JSON・YAMLの違いを、コメントの可否・読みやすさの観点で説明できる
  • JSON/YAML/XMLをパースした結果、Pythonでどのようなデータ型になるか説明できる
  • TDDのRed→Green→Refactorのサイクルを説明できる
  • Waterfall・Agile・Leanの特徴の違いを説明できる
  • 関数・クラス・モジュールそれぞれの役割と利点を説明できる
  • MVCパターンの3つの役割と、Observerパターンの仕組みを説明できる
  • バージョン管理がもたらす4つの利点を説明できる
  • clone / add / commit / push / pull / branch / merge / diff の役割をそれぞれ説明できる

理解度クイズ(簡易)

Q1. コメントを書けるデータフォーマットはどれ?

YAMLです。# を使ってコメントを記述できます。JSONとXML(標準)ではコメントは書けません。

Q2. TDDで最初に行うのはどのステップ?

Red(失敗するテストを先に書く)です。実装よりも先にテストを書く点がTDDの特徴です。

Q3. 短い反復(スプリント)を繰り返す開発手法はどれ?

Agile(アジャイル)です。Waterfallは一方向に進む手法、Leanはムダの排除に主眼を置いた考え方です。

Q4. 画面表示・入力処理・データを3つの役割に分離するデザインパターンはどれ?

MVC(Model・View・Controller)です。状態変化を複数の相手に自動通知するのはObserverパターンです。

Q5. マージ時にコンフリクトが発生した場合、次に行うべき操作の順番は?

競合箇所を手動で編集して解決する → git add で解決済みとしてマークする → git commit でマージを確定する、の順番です。

13 / 13

参考ソース

本ドキュメントの試験概要・試験ドメイン構成・出題比率は、以下のCisco公式ページおよび公式PDFの公開情報に基づいています。

技術的な用語・概念(データ形式、デザインパターン、Git等)の解説にあたっては、下記のような一般的に広く参照される技術資料も参考にしています。個別の技術仕様の最新情報は、それぞれの公式ドキュメントも合わせてご確認ください。

本ドキュメントは学習補助を目的とした非公式資料です。試験内容は予告なく変更される場合があるため、受験前に必ずCisco公式サイトで最新の試験トピックをご確認ください。