Examples: Junior software developer

From Talent Marketplace Signaling Community Group
Talent Signal
Wiki Navigation
Main Page
Issues, use cases and requirements
Examples
Other useful links
Community group home page
email list for group
relevant work elsewhere

This is a fictional example from JDX. The original is available as a Google doc (see also Senior Software Developer).

Note: The analysis below was carried out at the start of the Community Group's work in order to generate usecases. Since this analysis was carried out, several of the issues arising were resolved through the work of the Community Group by the addition of further properties to schema.org.

Status: Draft.

Summary: Much of the information in the example posting was encoded using the following properties: title, datePosted, description, hiringOrganization (using the name, url and address properties of Organization), validThrough, jobLocation, employmentType, baseSalary, identifier (using the name and value properties of a PropertyValue object) occupationCategory, reponsibilities and skills. There is a query about whether multiple values for employmentType should be combined with a logical AND or a logical OR.

Information relevant to the properties qualifications and educational / experienceRequirements could not be encoded because of interdependencies between alternative and compound requirements.

Information about a contact point for the job and the department within the hiring organization in which the job is located could not be encoded due to there being no suitable property in schema.org.

Potential issues arising:

  • There should be a means of providing contact details for a JobPosting (Note: issue resolved.)
  • There should be a means of providing information about the department within a hiring organization within which a job in a job posting is situated. (Note: issue resolved).
  • There is currently no means of combining requirements for a job posting (the various combinations of qualifications, experienceRequirements and educationRequirements in statements like "a 4 year degree AND six years of experience; OR a Ph.D. AND a current cybersecurity certification")
  • employmentType covers different categories of information which leads to some complications when more than one is present, for example compare the statement jobs that may be "FULL_TIME", "PART_TIME" (same category, implies OR?) with "TEMPORARY" "VOLUNTEER" (different categories, implies AND?).

Analysis

Looking first at those properties required for the Google JobPosting Search, then at the properties recommended for JobPosting Search, and then at any other information that can be expressed in schema.org. After this there there is a summary of what seems like significant information from the job advert that cannot currently be expressed with schema.org terms.

Title

Required by Google Job Search and the structured data testing tool.

title: The title of the job. (schema.org/title), to which Google Search adds "(not the title of the posting)"

In this case the title of the position is "Junior software developer":

"title": "Junior software developer"

Note: schema.org issue 2121 suggests replacing title with jobTitle.

Date posted

Required by Google Job Search and the structured data testing tool.

Date Posted: Publication date for the job posting (schema.org/datePosted), which should be a date value in ISO 8601 date format.

The advert says it was "Posted on 4/2/2021 18:23:01", which I am taking as a US-formatted date for "2nd April 2021"

"datePosted": "2021-02-04"

Description

Required by Google Job Search and the structured data testing tool.

description: A description of the item. (schema.org/description), to which Google Search adds "The full description of the job in HTML format" and "The description should be a complete representation of the job, including job responsibilities, qualifications, skills, working hours, education requirements, and experience requirements."

This suggests duplicating the entire body of the advert here. complete with with markup for headings paragraphs and lists.

For brevity, let's show this as:

"description": "<h1>Position summary</h1><p>At ACME Corp. as a junior software developer you’ll have exciting opportunities to be a part of a small technical team of developers while directly impacting company success</p>..."

Hiring organization

Required by Google Job Search and the structured data testing tool.

hiringOrganization: Organization offering the job position, expected to be of type Organization (hiringOrganization), to which Google Search adds: This should be the name of the company (for example, “Starbucks, Inc”), and not the specific location that is hiring (for example, “Starbucks on Main Street”).

The Google structured data testing tool seems only to need a name for the Organization given as the hiringOrganization. The position summary in the job advert mentions "ACME Corp." so let's take this as the name of the organization.

"hiringOrganization" : {
    "@type": "Organization",
    "name": "ACME Corp."
}

Note: if there is an issue in the legal name of the hiringOrganization being different to the commonly recognized name, then the schema.org legalName property could be used to provide the official company name.

We also have the street address and URL for the ACME Corp in the advert, so let's add them

"hiringOrganization" : {
    "@type": "Organization",
    "name": "ACME Corp.",
    "url": "www.example.com",
    "address": {
        "@type": "PostalAddress",
        "name": "Acme",
        "streetAddress": "123 Acme Way" ,
        "addressLocality": "New York" ,
        "addressRegion": "NY",
        "addressCountry": "US",
        "postalCode": "11223"
    }
}

Validity period of posting

Required by Google Job Search for postings that have an expiration date, optional in the structured data testing tool.

validThrough: The date after when the item is not valid. For example the end of an offer, salary period, or a period of opening hours (schema.org/validThrough). The value should be a DateTime

There is no expiration date given in the example, for the sake of providing example code let's assume it expires one month after posting.

"validThrough": "2021-03-04T18:23:01+05:00"

Job location

Required by Google Job Search and the structured data testing tool.

jobLocation: A (typically single) geographic location associated with the job position. (schema.org/jobLocation) The value is expected to be of type Place. To which Google Job Posting search adds: "The physical location(s) of the business where the employee will report to work (such as an office or worksite), not the location where the job was posted. Include as many fields as possible."

Let's assume that (a) this job isn't avaiable for remote workers, (b) it is located at the same address we gave for ACME Corp as an organization (while noting that in many cases this will not be the case).

"jobLocation": {
    "@type": "Place",
    "name": "ACME Corp Head Office",
    "address": {
        "@type": "PostalAddress",
        "name": "Acme",
        "streetAddress": "123 Acme Way" ,
        "addressLocality": "New York" ,
        "addressRegion": "NY",
        "addressCountry": "US",
        "postalCode": "11223"
    }

A geo location would be useful if we knew what the lattitude and longitude were for this address, but that is tricky with it being fictional. Such a location would look like

...
    "geo": {
        "@type": "schema:GeoCoordinates",
        "latitude": 40.68911
        "longitude": -74.04469
    }
...

Employment type

Recommended by Google Job Search and the structured data testing tool.

employmentType: Type of employment (e.g. full-time, part-time, contract, temporary, seasonal, internship). (schema.org/jobLocation) The value is expected to be text. Google search provides the following permitted values: "FULL_TIME", "PART_TIME", "CONTRACTOR", "TEMPORARY", "INTERN", "VOLUNTEER", "PER_DIEM", "OTHER".

The advert offers no information about this, but for the sake of providing an example let's assume that ACME are flexible in considering full- or part-time work.

"employmentType": ["FULL_TIME", "PART_TIME"]

Note: This shows how Google Search recommendations allow multiple values for employmentType but raises the question of whether values are combined with a logical AND or logical OR. In this case OR seems implied, however if the values were ["CONTRACTOR", "TEMPORARY"] one would assume AND. This arises because employmentType covers several aspects of the employment, including working schedule, term and hiring relationship; multiple values which are alternatives within a single aspect only makes sense if they are to be combined with OR, whereas multiple values from different aspects are more likely to be combined with an AND.

Note: There are some possible values that are not provided, notably for fixed-term employment.

Base salary

Recommended by Google Job Search and the structured data testing tool.

baseSalary: The base salary of the job or of an employee in an EmployeeRole. (schema.org/baseSalary) to which Google's guidance for JobPosting Search adds that this should be the actual base salary offered by the hiring organization, not an estimate. While schema.org allows several types to be used to provide a value (MonetaryAmount, Number and PriceSpecification), Google JobPosting Search specifies MonetaryAmount, so that a currency can be provided, with the example showing QuantitativeValue being used to provide the amount (as a value or range) and the time period over which this amount applies (as unitText, allowed values being: "HOUR" "DAY" "WEEK" "MONTH" "YEAR").

There is no information about salary in the example posting. For the sake of providing some code let's say the salary is in the range US$50-60000 p.a.:

"baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
        "@type": "QuantitativeValue",
        "minValue": 50000,
        "maxValue": 60000,
        "unitText": "YEAR"
    }
}

Identfifier

Recommended by Google Job Search.

identifier: The identifier property represents any kind of identifier for any kind of Thing. (schema.org/identifier, which goes on to give information about specific widely used identifiers not relevant here.) An identifier can be provided as a PropteryValue, Text or URL.

The advert includes the "internal HRIS ID: #4567-363F" which may be encoded as a property value so that we can encode the name of the identifier being used:

"identifier": {
    "@type": "PropertyValue",
    "name": "internal HRIS ID",
    "value": "#4567-363F"
}

Occupation Category

occupationalCategory: A category describing the job, preferably using a term from a taxonomy such as BLS O*NET-SOC, ISCO-08 or similar, with the property repeated for each applicable value. Ideally the taxonomy should be identified, and both the textual label and formal code for the category should be provided. schema.org/occupationalCategory

The information provide is "SOC Code: 15-1132.00" which is the O-Net code for "Software Developers, Applications" (which just happens to be one of the examples given by schema.org), so:

"occupationalCategory": {
    "@type": "CategoryCode",
    "inCodeSet": {
        "@type": "CategoryCodeSet",
        "name": "O*Net-SOC",
        "dateModified": "2019",
        "url": "https://www.onetonline.org/"
    },
    "codeValue": "15-1132.00",
    "name": "Software Developers, Applications",
    "url": "https://www.onetonline.org/link/summary/15-1132.00"
}

Responsibilities

responsibilities: Responsibilities associated with this role or Occupation (schema.org/responsibilities), expected to be provided as text.

The key responsibilities are listed in the advert, these can be translated to an array of individual text values. For the sake of brevity let's on list two in full and indicate the rest as "...".

"responsibilities": [
    "Writes, maintain application code, database queries, scripts. Maintains web pages. Develop, execute unit tests.",
    "Estimate work progress and time to completion on projects.",
    "..."
]

Skill requirements

skills: Skills required to fulfill this role or in this Occupation, expected to be text (schema.org/skills).

The list of "other requirements" near the end of the advert can be considered as skills. Again, let's truncate the list for the sake of making the example briefer:

"skills": [
    "Excellent analytical, problem solving skills.",
    "Good organizational skills and good oral/written presentation skills.",
    "..."
]

Note: is it a reasonable approximation to consider knowledge requirements (e.g. "Knowldge of SDP and other ACME IT development processes") to be skills?

Qualifications, education and experience requirements

Schema.org has properties for a JobPosting's educationRequirements: Educational background needed for the position or Occupation. (schema.org/educationRequirements)

experienceRequirements: Description of skills and experience needed for the position or Occupation (schema.org/experienceRequirements)

qualifications: Specific qualifications required for this role or Occupation, expected to be text or EducationalOccupationalCredential. (pending.schema.org/qualifications)

However, it is difficult to see how to apply these to the requirements listed in the job advert because:

(a) the requirements are often a combination of a qualification/credential and experience (e.g. "A 2 year IT certificate from an accredited institution AND 3 years of related job experience", emphasis added)

(b) there are alternative requirements, (e.g. the example in a, above is one of several alternatives to "BS Computer Science or equivalent).

and schema.org does not provide a mechanism for combining different types of requirement (i.e. combining an educationRequirement with an experienceRequirement) nor does it say how lists of alternatives can be provided requirements. The best that could be done here would be to list all the experience and education requirements together as the value for "experienceRequirement" (education is an experience, but the reverse is not necessarily true)

Contact information

There is contact information relevant to the jobPosting in the advert, for which there is no schema.org property (the closest match is contactPoint which would be the main point of contact for Acme Corp. Generally job postings have more specific contact points than that for the hiringOrganization as a whole.

Department

There is information in the example about the department within Acme ("ITS Division C"). For large multi-functional corporations like Acme undoubtedly is, it could be important to know in which department a job is located. Schema.org has no problem describing a department as an Organization that is a subOrganization of a larger Organization, but there is no way to link such a subOrganization to a jobPosting. The guidance from Google Job Posting Search is that the hiring organization should be the parent organization.

Disclaimer

There is a disclaimer in the job advert. Maybe it is adequate that this is part of the description?

Example Code

Pulling together all the JSON-LD fragments into a single example we get:

{
    "@context": "http://schema.org",
    "@type": "JobPosting",
    "title": "Junior software developer",
    "datePosted": "2021-02-04",
    "validThrough": "2021-03-04T18:23:01+05:00",
    "description": "<h1>Position summary</h1><p>At ACME Corp. as a junior software developer you’ll have exciting opportunities to be a part of a small technical team of developers while directly impacting company success.</p> ...",
    "hiringOrganization" : {
        "@type": "Organization",
        "name": "ACME Corp.",
        "url": "www.example.com",
        "address": {
            "@type": "PostalAddress",
            "name": "Acme",
            "streetAddress": "123 Acme Way" ,
            "addressLocality": "New York" ,
            "addressRegion": "NY",
            "addressCountry": "US",
            "postalCode": "11223"
        }
    },
    "jobLocation": {
        "@type": "Place",
        "name": "ACME Corp Head Office",
        "address": {
            "@type": "PostalAddress",
            "name": "Acme",
            "streetAddress": "123 Acme Way" ,
            "addressLocality": "New York" ,
            "addressRegion": "NY",
            "addressCountry": "US",
            "postalCode": "11223"
        }
    },
    "employmentType": ["FULL_TIME", "PART_TIME"],
    "baseSalary": {
        "@type": "MonetaryAmount",
        "currency": "USD",
        "value": {
            "@type": "QuantitativeValue",
            "minValue": 50000,
            "maxValue": 60000,
            "unitText": "YEAR"
        }
    },
    "identifier": {
        "@type": "PropertyValue",
        "name": "internal HRIS ID",
        "value": "#4567-363F"
    },
    "occupationalCategory": {
        "@type": "CategoryCode",
        "inCodeSet": {
            "@type": "CategoryCodeSet",
            "name": "O*Net-SOC",
            "dateModified": "2019",
            "url": "https://www.onetonline.org/"
        },
        "codeValue": "15-1132.00",
        "name": "Software Developers, Applications",
        "url": "https://www.onetonline.org/link/summary/15-1132.00"
    },
    "responsibilities": [
        "Writes, maintain application code, database queries, scripts. Maintains web pages. Develop, execute unit tests.",
        "Estimate work progress and time to completion on projects.",
        "..."
    ],
    "skills": [
        "Excellent analytical, problem solving skills.",
        "Good organizational skills and good oral/written presentation skills.",
        "..."
    ]
}