200-901 software development explained

Updated October 9, 2026

Software Development and Design is worth 15% of 200-901. It covers data formats and how they parse into Python, test-driven development, development methods, code organisation, two design patterns and the Git operations you use daily. The questions are conceptual and short, and they favour candidates who have actually committed code and resolved a merge conflict.

Data formats and Python structures

FormatStylePython result
JSONBraces, brackets, quoted keysdict, list, str, int, bool, None
YAMLIndentation, dashes for listsSame structures; indentation errors are common
XMLTags and attributesA tree of elements; parsed with xml.etree.ElementTree

JSON true, false and null become True, False and None. json.loads takes a string; json.load takes a file. YAML is a superset of JSON in practice and is favoured for configuration such as Ansible playbooks; load it with yaml.safe_load. XML is verbose, supports attributes and namespaces, and is still used by NETCONF and some Cisco APIs.

Know how to read a nested structure: data["interfaces"][0]["name"] is the name of the first item in a list inside a dictionary.

Test-driven development

TDD means writing a failing test first (red), writing the least code that passes it (green), then cleaning up (refactor). The benefit exam questions look for is a safety net: when you change code later, the tests tell you what broke. Writing the tests after the code is not TDD, even if the tests exist.

Development methods

MethodCore idea
WaterfallSequential phases; requirements fixed up front
AgileShort iterations, working software, feedback, change welcomed
LeanRemove waste, deliver value early, limit work in progress

Code organisation

Functions group steps you repeat, classes bundle data with behaviour, and modules group related code into files you import. The benefits are reuse, easier testing and readability. If a scenario describes copy-pasted code that needs to change in ten places, the answer is a function or module.

Design patterns

MVC separates the data and rules (model), the presentation (view) and the part that handles input and updates the other two (controller). Its advantage is that you can change the interface without touching the business logic.

Observer lets objects (observers) subscribe to another object (the subject) and be notified when it changes, without the subject knowing details about them. Think of event notifications and webhooks.

Version control and Git

Version control keeps history, supports collaboration, lets you branch and merge, and lets you roll back a bad change.

OperationCommandPurpose
Clonegit clone <url>Copy a remote repository locally
Add or removegit add, git rmStage a change
Commitgit commit -mRecord staged changes locally
Push / pullgit push, git pullSend / fetch and merge remote commits
Branchgit branch, git switchWork on an isolated line of changes
Mergegit mergeCombine branches
Diffgit diffShow changes

A merge conflict happens when two branches changed the same lines. Git writes markers (<<<<<<<, =======, >>>>>>>) into the file. You edit the file to the correct content, remove the markers, git add it and commit. A commit is local until you push.

Example questions

Question 1. A team keeps a configuration file in YAML. A Python script must read it into a dictionary. Which approach is correct?

  • A. Pass the file contents to json.loads
  • B. Pass the file contents to yaml.safe_load
  • C. Read the file with open().read() and use the string as a dictionary
  • D. Parse the file with xml.etree.ElementTree
Show answer

Answer: B

A YAML parser such as yaml.safe_load converts YAML text into Python dictionaries and lists. json.loads expects JSON syntax and would fail on typical YAML. Reading the file with read() returns one string, not a dictionary. ElementTree parses XML, not YAML.

Want more questions like this? Full 200-901 practice tests →

Question 2. Two developers edit the same lines of a file on different branches. After running git merge, Git reports a conflict. What should the developer do next?

  • A. Delete the local repository and clone again
  • B. Run git push so the remote can resolve it
  • C. Run git clone to refresh the files
  • D. Edit the file to remove the conflict markers, then git add and commit
Show answer

Answer: D

Git marks the conflicting sections in the file; the developer edits the file to the intended content, removes the markers, stages the file with git add and then commits. Deleting the repository loses work. Pushing without resolving is rejected or leaves markers in the code. git clone does not resolve a local conflict.

Want more questions like this? Full 200-901 practice tests →

Question 3. A developer writes a failing unit test for a new function, writes the minimum code to make it pass, and then restructures the code without changing behaviour. Which practice is this?

  • A. Test-driven development
  • B. The waterfall method
  • C. The Observer pattern
  • D. Writing tests after implementation
Show answer

Answer: A

Writing a failing test, making it pass with minimal code and then refactoring is test-driven development. Waterfall is a sequential method. The Observer pattern is about subscribing to change notifications. Writing tests after the code is complete is not TDD.

Want more questions like this? Full 200-901 practice tests →

Next: understanding and using APIs. Check the weights in the exam format. For the code side of network work see infrastructure and automation.